Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:166e0710d217, 2017-01-27 (annotated)
- Committer:
- kenjiArai
- Date:
- Fri Jan 27 04:07:01 2017 +0000
- Revision:
- 0:166e0710d217
Morse code (CW) decoder program. Original source is made by Hjalmar Skovholm Hansen OZ1JHM. The program uses the Goertzel Algorithm.
;
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| kenjiArai | 0:166e0710d217 | 1 | /* |
| kenjiArai | 0:166e0710d217 | 2 | * mbed program / cwdecoder |
| kenjiArai | 0:166e0710d217 | 3 | * using the Goertzel Algorithm |
| kenjiArai | 0:166e0710d217 | 4 | * tested on Nucleo-F411RE, F446RE, L476RG mbed board |
| kenjiArai | 0:166e0710d217 | 5 | * |
| kenjiArai | 0:166e0710d217 | 6 | * Modified by Kenji Arai |
| kenjiArai | 0:166e0710d217 | 7 | * http://www.page.sannet.ne.jp/kenjia/index.html |
| kenjiArai | 0:166e0710d217 | 8 | * http://mbed.org/users/kenjiArai/ |
| kenjiArai | 0:166e0710d217 | 9 | * |
| kenjiArai | 0:166e0710d217 | 10 | * Started: January 16th, 2017 |
| kenjiArai | 0:166e0710d217 | 11 | * Revised: January 27th, 2017 |
| kenjiArai | 0:166e0710d217 | 12 | * |
| kenjiArai | 0:166e0710d217 | 13 | * Original program: -> See refernce.txt |
| kenjiArai | 0:166e0710d217 | 14 | * http://skovholm.com/cwdecoder |
| kenjiArai | 0:166e0710d217 | 15 | * by Hjalmar Skovholm Hansen OZ1JHM |
| kenjiArai | 0:166e0710d217 | 16 | * |
| kenjiArai | 0:166e0710d217 | 17 | * Reference: -> See refernce.txt |
| kenjiArai | 0:166e0710d217 | 18 | * https://courses.cs.washington.edu/courses/cse466/12au/ |
| kenjiArai | 0:166e0710d217 | 19 | * calendar/Goertzel-EETimes.pdf |
| kenjiArai | 0:166e0710d217 | 20 | * by Kevin Banks |
| kenjiArai | 0:166e0710d217 | 21 | * http://archive.eetindia.co.in/www.eetindia.co.in/ |
| kenjiArai | 0:166e0710d217 | 22 | * STATIC/DOWNLOAD/09banks.txt |
| kenjiArai | 0:166e0710d217 | 23 | */ |
| kenjiArai | 0:166e0710d217 | 24 | /////////////////////////////////////////////////////////////////////// |
| kenjiArai | 0:166e0710d217 | 25 | // CW Decoder made by Hjalmar Skovholm Hansen OZ1JHM VER 1.01 // |
| kenjiArai | 0:166e0710d217 | 26 | // Feel free to change, copy or what ever you like but respect // |
| kenjiArai | 0:166e0710d217 | 27 | // that license is http://www.gnu.org/copyleft/gpl.html // |
| kenjiArai | 0:166e0710d217 | 28 | // Discuss and give great ideas on // |
| kenjiArai | 0:166e0710d217 | 29 | // https://groups.yahoo.com/neo/groups/oz1jhm/conversations/messages // |
| kenjiArai | 0:166e0710d217 | 30 | /////////////////////////////////////////////////////////////////////// |
| kenjiArai | 0:166e0710d217 | 31 | |
| kenjiArai | 0:166e0710d217 | 32 | // Include -------------------------------------------------------------------- |
| kenjiArai | 0:166e0710d217 | 33 | #include "mbed.h" |
| kenjiArai | 0:166e0710d217 | 34 | #include "configuration.h" |
| kenjiArai | 0:166e0710d217 | 35 | #include "TextLCD.h" |
| kenjiArai | 0:166e0710d217 | 36 | |
| kenjiArai | 0:166e0710d217 | 37 | // Definition ----------------------------------------------------------------- |
| kenjiArai | 0:166e0710d217 | 38 | // see configuration.h |
| kenjiArai | 0:166e0710d217 | 39 | |
| kenjiArai | 0:166e0710d217 | 40 | // Object --------------------------------------------------------------------- |
| kenjiArai | 0:166e0710d217 | 41 | AnalogIn analog(A0); |
| kenjiArai | 0:166e0710d217 | 42 | DigitalOut myled(LED1); |
| kenjiArai | 0:166e0710d217 | 43 | DigitalOut ad_cnv(D5); |
| kenjiArai | 0:166e0710d217 | 44 | DigitalOut loop_trg(D6); |
| kenjiArai | 0:166e0710d217 | 45 | DigitalOut buzzer(D7); |
| kenjiArai | 0:166e0710d217 | 46 | Serial pc(USBTX, USBRX); |
| kenjiArai | 0:166e0710d217 | 47 | Timer t; |
| kenjiArai | 0:166e0710d217 | 48 | Ticker event; |
| kenjiArai | 0:166e0710d217 | 49 | I2C i2c(PB_9, PB_8); // SDA, SCL |
| kenjiArai | 0:166e0710d217 | 50 | TextLCD_I2C_N lcd(&i2c, ST7036_SA2, TextLCD::LCD16x2, NC, TextLCD::ST7032_3V3); |
| kenjiArai | 0:166e0710d217 | 51 | |
| kenjiArai | 0:166e0710d217 | 52 | // RAM ------------------------------------------------------------------------ |
| kenjiArai | 0:166e0710d217 | 53 | double magnitude ; |
| kenjiArai | 0:166e0710d217 | 54 | int16_t magnitudelimit = 100; |
| kenjiArai | 0:166e0710d217 | 55 | int16_t magnitudelimit_low = 100; |
| kenjiArai | 0:166e0710d217 | 56 | int16_t realstate = LOW; |
| kenjiArai | 0:166e0710d217 | 57 | int16_t realstatebefore = LOW; |
| kenjiArai | 0:166e0710d217 | 58 | int16_t filteredstate = LOW; |
| kenjiArai | 0:166e0710d217 | 59 | int16_t filteredstatebefore = LOW; |
| kenjiArai | 0:166e0710d217 | 60 | |
| kenjiArai | 0:166e0710d217 | 61 | volatile bool adc_action = false; |
| kenjiArai | 0:166e0710d217 | 62 | |
| kenjiArai | 0:166e0710d217 | 63 | uint8_t n = SAMPLE_NUM; |
| kenjiArai | 0:166e0710d217 | 64 | double coeff; |
| kenjiArai | 0:166e0710d217 | 65 | double Q1 = 0.0f; |
| kenjiArai | 0:166e0710d217 | 66 | double Q2 = 0.0f; |
| kenjiArai | 0:166e0710d217 | 67 | double sine; |
| kenjiArai | 0:166e0710d217 | 68 | double cosine; |
| kenjiArai | 0:166e0710d217 | 69 | double sampling_freq = SAMPLE_RATE; |
| kenjiArai | 0:166e0710d217 | 70 | double target_freq = TARGET_FREQ; |
| kenjiArai | 0:166e0710d217 | 71 | double testData[SAMPLE_NUM + 10]; |
| kenjiArai | 0:166e0710d217 | 72 | double bw; |
| kenjiArai | 0:166e0710d217 | 73 | |
| kenjiArai | 0:166e0710d217 | 74 | // Noise Blanker time which shall be computed so this is initial |
| kenjiArai | 0:166e0710d217 | 75 | int16_t nbtime = 2; // ms noise blanker |
| kenjiArai | 0:166e0710d217 | 76 | int32_t starttimehigh; |
| kenjiArai | 0:166e0710d217 | 77 | int32_t highduration; |
| kenjiArai | 0:166e0710d217 | 78 | int32_t lasthighduration; |
| kenjiArai | 0:166e0710d217 | 79 | int32_t hightimesavg; |
| kenjiArai | 0:166e0710d217 | 80 | int32_t lowtimesavg; |
| kenjiArai | 0:166e0710d217 | 81 | int32_t startttimelow; |
| kenjiArai | 0:166e0710d217 | 82 | int32_t lowduration; |
| kenjiArai | 0:166e0710d217 | 83 | int32_t laststarttime = 0; |
| kenjiArai | 0:166e0710d217 | 84 | char code[32]; |
| kenjiArai | 0:166e0710d217 | 85 | int16_t stop = LOW; |
| kenjiArai | 0:166e0710d217 | 86 | int16_t wpm; |
| kenjiArai | 0:166e0710d217 | 87 | |
| kenjiArai | 0:166e0710d217 | 88 | // ROM / Constant data -------------------------------------------------------- |
| kenjiArai | 0:166e0710d217 | 89 | |
| kenjiArai | 0:166e0710d217 | 90 | // Function prototypes -------------------------------------------------------- |
| kenjiArai | 0:166e0710d217 | 91 | void setup(void); |
| kenjiArai | 0:166e0710d217 | 92 | void loop(void); |
| kenjiArai | 0:166e0710d217 | 93 | void docode(void); |
| kenjiArai | 0:166e0710d217 | 94 | void printascii(char); |
| kenjiArai | 0:166e0710d217 | 95 | void adc_convert(void); |
| kenjiArai | 0:166e0710d217 | 96 | |
| kenjiArai | 0:166e0710d217 | 97 | //------------------------------------------------------------------------------ |
| kenjiArai | 0:166e0710d217 | 98 | // Control Program |
| kenjiArai | 0:166e0710d217 | 99 | //------------------------------------------------------------------------------ |
| kenjiArai | 0:166e0710d217 | 100 | int main(){ |
| kenjiArai | 0:166e0710d217 | 101 | setup(); |
| kenjiArai | 0:166e0710d217 | 102 | double sampling_cycle = 1.0f / sampling_freq; |
| kenjiArai | 0:166e0710d217 | 103 | event.attach(&adc_convert, sampling_cycle); |
| kenjiArai | 0:166e0710d217 | 104 | t.start(); // start timer |
| kenjiArai | 0:166e0710d217 | 105 | // LCD |
| kenjiArai | 0:166e0710d217 | 106 | lcd.setContrast(0x1a); |
| kenjiArai | 0:166e0710d217 | 107 | lcd.locate(0, 0); // 1st line top |
| kenjiArai | 0:166e0710d217 | 108 | // 1234567890123456 |
| kenjiArai | 0:166e0710d217 | 109 | lcd.printf(" CW Decoder "); |
| kenjiArai | 0:166e0710d217 | 110 | lcd.locate(0, 1); // 2nd line top |
| kenjiArai | 0:166e0710d217 | 111 | // 1234567890123456 |
| kenjiArai | 0:166e0710d217 | 112 | lcd.printf(" by JH1PJL"); |
| kenjiArai | 0:166e0710d217 | 113 | while(true){ |
| kenjiArai | 0:166e0710d217 | 114 | myled = !myled; |
| kenjiArai | 0:166e0710d217 | 115 | loop(); |
| kenjiArai | 0:166e0710d217 | 116 | } |
| kenjiArai | 0:166e0710d217 | 117 | } |
| kenjiArai | 0:166e0710d217 | 118 | |
| kenjiArai | 0:166e0710d217 | 119 | void setup(){ // Initial setting for goertzel calculation |
| kenjiArai | 0:166e0710d217 | 120 | bw = sampling_freq / (double)n; |
| kenjiArai | 0:166e0710d217 | 121 | double k = (int16_t) (0.5f + (((double)n * target_freq) / sampling_freq)); |
| kenjiArai | 0:166e0710d217 | 122 | double omega = (2.0f * PI * k) / (double)n; |
| kenjiArai | 0:166e0710d217 | 123 | sine = sin(omega); |
| kenjiArai | 0:166e0710d217 | 124 | cosine = cos(omega); |
| kenjiArai | 0:166e0710d217 | 125 | coeff = 2.0f * cosine; |
| kenjiArai | 0:166e0710d217 | 126 | } |
| kenjiArai | 0:166e0710d217 | 127 | |
| kenjiArai | 0:166e0710d217 | 128 | // Interruput service routine (triggered by event.attach(..,..) |
| kenjiArai | 0:166e0710d217 | 129 | void adc_convert(){ |
| kenjiArai | 0:166e0710d217 | 130 | adc_action = false; |
| kenjiArai | 0:166e0710d217 | 131 | //if (adc_action == true){ adc_action = false;} |
| kenjiArai | 0:166e0710d217 | 132 | } |
| kenjiArai | 0:166e0710d217 | 133 | |
| kenjiArai | 0:166e0710d217 | 134 | void loop(){ |
| kenjiArai | 0:166e0710d217 | 135 | loop_trg = !loop_trg; |
| kenjiArai | 0:166e0710d217 | 136 | DEBUG("sample=, %u, ", n); |
| kenjiArai | 0:166e0710d217 | 137 | for (int8_t index = 0; index < n; index++){ |
| kenjiArai | 0:166e0710d217 | 138 | // start sampling |
| kenjiArai | 0:166e0710d217 | 139 | ad_cnv = 1; |
| kenjiArai | 0:166e0710d217 | 140 | adc_action = true; |
| kenjiArai | 0:166e0710d217 | 141 | // wait sampling |
| kenjiArai | 0:166e0710d217 | 142 | while (adc_action == true){ ;} |
| kenjiArai | 0:166e0710d217 | 143 | ad_cnv = 0; |
| kenjiArai | 0:166e0710d217 | 144 | testData[index] = analog.read() * 1024.0f; |
| kenjiArai | 0:166e0710d217 | 145 | DEBUG("%f, ", testData[index]); |
| kenjiArai | 0:166e0710d217 | 146 | double Q0 = coeff * Q1 - Q2 + testData[index]; |
| kenjiArai | 0:166e0710d217 | 147 | Q2 = Q1; |
| kenjiArai | 0:166e0710d217 | 148 | Q1 = Q0; |
| kenjiArai | 0:166e0710d217 | 149 | } |
| kenjiArai | 0:166e0710d217 | 150 | // only need the real part |
| kenjiArai | 0:166e0710d217 | 151 | double magnitudeSquared = (Q1 * Q1) + (Q2 * Q2) - Q1 * Q2 * coeff; |
| kenjiArai | 0:166e0710d217 | 152 | DEBUG(", mag, %f\r\n", magnitudeSquared); |
| kenjiArai | 0:166e0710d217 | 153 | magnitude = sqrt(magnitudeSquared); |
| kenjiArai | 0:166e0710d217 | 154 | Q2 = 0.0f; |
| kenjiArai | 0:166e0710d217 | 155 | Q1 = 0.0f; |
| kenjiArai | 0:166e0710d217 | 156 | // magnitude limit automatic |
| kenjiArai | 0:166e0710d217 | 157 | if (magnitude > magnitudelimit_low){ |
| kenjiArai | 0:166e0710d217 | 158 | // moving average filter |
| kenjiArai | 0:166e0710d217 | 159 | magnitudelimit = |
| kenjiArai | 0:166e0710d217 | 160 | (magnitudelimit +((magnitude - magnitudelimit) / 6.0f)); |
| kenjiArai | 0:166e0710d217 | 161 | } |
| kenjiArai | 0:166e0710d217 | 162 | if (magnitudelimit < magnitudelimit_low){ |
| kenjiArai | 0:166e0710d217 | 163 | magnitudelimit = magnitudelimit_low; |
| kenjiArai | 0:166e0710d217 | 164 | } |
| kenjiArai | 0:166e0710d217 | 165 | // check for the magnitude |
| kenjiArai | 0:166e0710d217 | 166 | if(magnitude > magnitudelimit * 0.6f){ // just to have some space up |
| kenjiArai | 0:166e0710d217 | 167 | realstate = HIGH; |
| kenjiArai | 0:166e0710d217 | 168 | } else { |
| kenjiArai | 0:166e0710d217 | 169 | realstate = LOW; |
| kenjiArai | 0:166e0710d217 | 170 | } |
| kenjiArai | 0:166e0710d217 | 171 | // clean up the state with a noise blanker |
| kenjiArai | 0:166e0710d217 | 172 | if (realstate != realstatebefore){ |
| kenjiArai | 0:166e0710d217 | 173 | laststarttime = MILLIS(); |
| kenjiArai | 0:166e0710d217 | 174 | } |
| kenjiArai | 0:166e0710d217 | 175 | if ((MILLIS()-laststarttime)> nbtime){ |
| kenjiArai | 0:166e0710d217 | 176 | if (realstate != filteredstate){ |
| kenjiArai | 0:166e0710d217 | 177 | filteredstate = realstate; |
| kenjiArai | 0:166e0710d217 | 178 | } |
| kenjiArai | 0:166e0710d217 | 179 | } |
| kenjiArai | 0:166e0710d217 | 180 | // durations on high and low |
| kenjiArai | 0:166e0710d217 | 181 | if (filteredstate != filteredstatebefore){ |
| kenjiArai | 0:166e0710d217 | 182 | if (filteredstate == HIGH){ |
| kenjiArai | 0:166e0710d217 | 183 | starttimehigh = MILLIS(); |
| kenjiArai | 0:166e0710d217 | 184 | lowduration = (MILLIS() - startttimelow); |
| kenjiArai | 0:166e0710d217 | 185 | } |
| kenjiArai | 0:166e0710d217 | 186 | if (filteredstate == LOW){ |
| kenjiArai | 0:166e0710d217 | 187 | startttimelow = MILLIS(); |
| kenjiArai | 0:166e0710d217 | 188 | highduration = (MILLIS() - starttimehigh); |
| kenjiArai | 0:166e0710d217 | 189 | if (highduration < (2.0f *hightimesavg) || hightimesavg == 0.0f){ |
| kenjiArai | 0:166e0710d217 | 190 | // now we know avg dit time ( rolling 3 avg) |
| kenjiArai | 0:166e0710d217 | 191 | hightimesavg = (highduration+hightimesavg+hightimesavg) / 3.0f; |
| kenjiArai | 0:166e0710d217 | 192 | } |
| kenjiArai | 0:166e0710d217 | 193 | if (highduration > (5.0f * hightimesavg) ){ |
| kenjiArai | 0:166e0710d217 | 194 | // if speed decrease fast .. |
| kenjiArai | 0:166e0710d217 | 195 | hightimesavg = highduration+hightimesavg; |
| kenjiArai | 0:166e0710d217 | 196 | } |
| kenjiArai | 0:166e0710d217 | 197 | } |
| kenjiArai | 0:166e0710d217 | 198 | } |
| kenjiArai | 0:166e0710d217 | 199 | // now we will check which kind of baud we have - dit or dah |
| kenjiArai | 0:166e0710d217 | 200 | // and what kind of pause we do have 1 - 3 or 7 pause |
| kenjiArai | 0:166e0710d217 | 201 | // we think that hightimeavg = 1 bit |
| kenjiArai | 0:166e0710d217 | 202 | if (filteredstate != filteredstatebefore){ |
| kenjiArai | 0:166e0710d217 | 203 | stop = LOW; |
| kenjiArai | 0:166e0710d217 | 204 | if (filteredstate == LOW){ //// we did end a HIGH |
| kenjiArai | 0:166e0710d217 | 205 | // 0.6 filter out false dits |
| kenjiArai | 0:166e0710d217 | 206 | if (highduration < (hightimesavg * 2.0f) |
| kenjiArai | 0:166e0710d217 | 207 | && highduration > (hightimesavg * 0.6f)){ |
| kenjiArai | 0:166e0710d217 | 208 | strcat(code,"."); |
| kenjiArai | 0:166e0710d217 | 209 | DEBUG("."); |
| kenjiArai | 0:166e0710d217 | 210 | } |
| kenjiArai | 0:166e0710d217 | 211 | if (highduration > (hightimesavg*2) |
| kenjiArai | 0:166e0710d217 | 212 | && highduration < (hightimesavg * 6.0f)){ |
| kenjiArai | 0:166e0710d217 | 213 | strcat(code,"-"); |
| kenjiArai | 0:166e0710d217 | 214 | DEBUG("-"); |
| kenjiArai | 0:166e0710d217 | 215 | wpm = (wpm + (1200/((highduration)/3)))/2; |
| kenjiArai | 0:166e0710d217 | 216 | } |
| kenjiArai | 0:166e0710d217 | 217 | } |
| kenjiArai | 0:166e0710d217 | 218 | if (filteredstate == HIGH){ // we did end a LOW |
| kenjiArai | 0:166e0710d217 | 219 | double lacktime = 1; |
| kenjiArai | 0:166e0710d217 | 220 | // when high speeds we have to have a little more pause |
| kenjiArai | 0:166e0710d217 | 221 | // before new letter or new word |
| kenjiArai | 0:166e0710d217 | 222 | if(wpm > 25){ lacktime = 1.0f;} |
| kenjiArai | 0:166e0710d217 | 223 | if(wpm > 30){ lacktime = 1.2f;} |
| kenjiArai | 0:166e0710d217 | 224 | if(wpm > 35){ lacktime = 1.5f;} |
| kenjiArai | 0:166e0710d217 | 225 | if(wpm > 40){ lacktime = 1.7f;} |
| kenjiArai | 0:166e0710d217 | 226 | if(wpm > 45){ lacktime = 1.9f;} |
| kenjiArai | 0:166e0710d217 | 227 | if(wpm > 50){ lacktime = 2.0f;} |
| kenjiArai | 0:166e0710d217 | 228 | if (lowduration > (hightimesavg*(2.0f * lacktime)) |
| kenjiArai | 0:166e0710d217 | 229 | && lowduration < hightimesavg*(5.0f * lacktime)){ |
| kenjiArai | 0:166e0710d217 | 230 | docode(); |
| kenjiArai | 0:166e0710d217 | 231 | code[0] = '\0'; |
| kenjiArai | 0:166e0710d217 | 232 | DEBUG("/"); |
| kenjiArai | 0:166e0710d217 | 233 | } |
| kenjiArai | 0:166e0710d217 | 234 | if (lowduration >= hightimesavg*(5.0f * lacktime)){ // word space |
| kenjiArai | 0:166e0710d217 | 235 | docode(); |
| kenjiArai | 0:166e0710d217 | 236 | code[0] = '\0'; |
| kenjiArai | 0:166e0710d217 | 237 | printascii(' '); |
| kenjiArai | 0:166e0710d217 | 238 | DEBUG("\r\n"); |
| kenjiArai | 0:166e0710d217 | 239 | } |
| kenjiArai | 0:166e0710d217 | 240 | } |
| kenjiArai | 0:166e0710d217 | 241 | } |
| kenjiArai | 0:166e0710d217 | 242 | // write if no more letters |
| kenjiArai | 0:166e0710d217 | 243 | if ((MILLIS() - startttimelow) > (highduration * 6.0f) && stop == LOW){ |
| kenjiArai | 0:166e0710d217 | 244 | docode(); |
| kenjiArai | 0:166e0710d217 | 245 | code[0] = '\0'; |
| kenjiArai | 0:166e0710d217 | 246 | stop = HIGH; |
| kenjiArai | 0:166e0710d217 | 247 | } |
| kenjiArai | 0:166e0710d217 | 248 | // we will turn on and off the LED |
| kenjiArai | 0:166e0710d217 | 249 | // and the speaker |
| kenjiArai | 0:166e0710d217 | 250 | if(filteredstate == HIGH){ |
| kenjiArai | 0:166e0710d217 | 251 | myled = HIGH; |
| kenjiArai | 0:166e0710d217 | 252 | buzzer = 1; |
| kenjiArai | 0:166e0710d217 | 253 | } else { |
| kenjiArai | 0:166e0710d217 | 254 | myled = LOW; |
| kenjiArai | 0:166e0710d217 | 255 | buzzer = 0; |
| kenjiArai | 0:166e0710d217 | 256 | } |
| kenjiArai | 0:166e0710d217 | 257 | // the end of main loop clean up |
| kenjiArai | 0:166e0710d217 | 258 | realstatebefore = realstate; |
| kenjiArai | 0:166e0710d217 | 259 | lasthighduration = highduration; |
| kenjiArai | 0:166e0710d217 | 260 | filteredstatebefore = filteredstate; |
| kenjiArai | 0:166e0710d217 | 261 | } |
| kenjiArai | 0:166e0710d217 | 262 | |
| kenjiArai | 0:166e0710d217 | 263 | // translate cw code to ascii |
| kenjiArai | 0:166e0710d217 | 264 | void docode(){ |
| kenjiArai | 0:166e0710d217 | 265 | if (code[0] == '.'){ // . |
| kenjiArai | 0:166e0710d217 | 266 | if (code[1] == '.'){ // .. |
| kenjiArai | 0:166e0710d217 | 267 | if (code[2] == '.'){ // ... |
| kenjiArai | 0:166e0710d217 | 268 | if (code[3] == '.'){ // .... |
| kenjiArai | 0:166e0710d217 | 269 | if (strcmp(code,"...." ) == 0){ printascii('H'); return;} |
| kenjiArai | 0:166e0710d217 | 270 | if (strcmp(code,"....." ) == 0){ printascii('5'); return;} |
| kenjiArai | 0:166e0710d217 | 271 | if (strcmp(code,"....-" ) == 0){ printascii('4'); return;} |
| kenjiArai | 0:166e0710d217 | 272 | } else if (code[3] == '-'){ // ...- |
| kenjiArai | 0:166e0710d217 | 273 | if (code[4] == '.'){ // ...-. |
| kenjiArai | 0:166e0710d217 | 274 | if (strcmp(code,"...-." ) == 0) |
| kenjiArai | 0:166e0710d217 | 275 | { printascii(126); return;} |
| kenjiArai | 0:166e0710d217 | 276 | if (strcmp(code,"...-.-" ) == 0) |
| kenjiArai | 0:166e0710d217 | 277 | { printascii(62); return;} |
| kenjiArai | 0:166e0710d217 | 278 | if (strcmp(code,"...-..-") == 0) |
| kenjiArai | 0:166e0710d217 | 279 | { printascii(36); return;} |
| kenjiArai | 0:166e0710d217 | 280 | } else if (code[4] == '-'){ // ...-- |
| kenjiArai | 0:166e0710d217 | 281 | if (strcmp(code,"...--" ) == 0) |
| kenjiArai | 0:166e0710d217 | 282 | { printascii('3'); return;} |
| kenjiArai | 0:166e0710d217 | 283 | } else { |
| kenjiArai | 0:166e0710d217 | 284 | if (strcmp(code,"...-" ) == 0) |
| kenjiArai | 0:166e0710d217 | 285 | { printascii('V'); return;} |
| kenjiArai | 0:166e0710d217 | 286 | } |
| kenjiArai | 0:166e0710d217 | 287 | } else { // ... |
| kenjiArai | 0:166e0710d217 | 288 | if (strcmp(code,"..." ) == 0){ printascii('S'); return;} |
| kenjiArai | 0:166e0710d217 | 289 | } |
| kenjiArai | 0:166e0710d217 | 290 | } else if (code[2] == '-'){ // ..- |
| kenjiArai | 0:166e0710d217 | 291 | if (strcmp(code,"..-" ) == 0){ printascii('U'); return;} |
| kenjiArai | 0:166e0710d217 | 292 | if (strcmp(code,"..-." ) == 0){ printascii('F'); return;} |
| kenjiArai | 0:166e0710d217 | 293 | if (strcmp(code,"..---" ) == 0){ printascii('2'); return;} |
| kenjiArai | 0:166e0710d217 | 294 | if (strcmp(code,"..--.." ) == 0){ printascii(63); return;} |
| kenjiArai | 0:166e0710d217 | 295 | } else { // .. |
| kenjiArai | 0:166e0710d217 | 296 | if (strcmp(code,".." ) == 0){ printascii('I'); return;} |
| kenjiArai | 0:166e0710d217 | 297 | } |
| kenjiArai | 0:166e0710d217 | 298 | } else if (code[1] == '-'){ // .- |
| kenjiArai | 0:166e0710d217 | 299 | if (code[2] == '.'){ // .-. |
| kenjiArai | 0:166e0710d217 | 300 | if (code[3] == '.'){ // .-.. |
| kenjiArai | 0:166e0710d217 | 301 | if (strcmp(code,".-.." ) == 0){ printascii('L'); return;} |
| kenjiArai | 0:166e0710d217 | 302 | if (strcmp(code,".-..." ) == 0){ printascii(95); return;} |
| kenjiArai | 0:166e0710d217 | 303 | } else if (code[3] == '-'){ // .-.- |
| kenjiArai | 0:166e0710d217 | 304 | if (strcmp(code,".-.-" ) == 0){ printascii(3); return;} |
| kenjiArai | 0:166e0710d217 | 305 | if (strcmp(code,".-.-." ) == 0){ printascii(60); return;} |
| kenjiArai | 0:166e0710d217 | 306 | if (strcmp(code,".-.-.-" ) == 0){ printascii(46); return;} |
| kenjiArai | 0:166e0710d217 | 307 | } else { // .-. |
| kenjiArai | 0:166e0710d217 | 308 | if (strcmp(code,".-." ) == 0){ printascii('R'); return;} |
| kenjiArai | 0:166e0710d217 | 309 | } |
| kenjiArai | 0:166e0710d217 | 310 | } else if (code[2] == '-'){ // .-- |
| kenjiArai | 0:166e0710d217 | 311 | if (code[3] == '.'){ // .--. |
| kenjiArai | 0:166e0710d217 | 312 | if (strcmp(code,".--." ) == 0){ printascii('P'); return;} |
| kenjiArai | 0:166e0710d217 | 313 | if (strcmp(code,".--.-" ) == 0){ printascii(6); return;} |
| kenjiArai | 0:166e0710d217 | 314 | if (strcmp(code,".--.-." ) == 0){ printascii(64); return;} |
| kenjiArai | 0:166e0710d217 | 315 | } else if (code[3] == '-'){ // .--- |
| kenjiArai | 0:166e0710d217 | 316 | if (strcmp(code,".---" ) == 0){ printascii('J'); return;} |
| kenjiArai | 0:166e0710d217 | 317 | if (strcmp(code,".----" ) == 0){ printascii('1'); return;} |
| kenjiArai | 0:166e0710d217 | 318 | } else { // .-- |
| kenjiArai | 0:166e0710d217 | 319 | if (strcmp(code,".--" ) == 0){ printascii('W'); return;} |
| kenjiArai | 0:166e0710d217 | 320 | } |
| kenjiArai | 0:166e0710d217 | 321 | } else { // .- |
| kenjiArai | 0:166e0710d217 | 322 | if (strcmp(code,".-") == 0){ printascii('A'); return;} |
| kenjiArai | 0:166e0710d217 | 323 | } |
| kenjiArai | 0:166e0710d217 | 324 | } else { // . |
| kenjiArai | 0:166e0710d217 | 325 | if (strcmp(code,".") == 0){ printascii('E'); return;} |
| kenjiArai | 0:166e0710d217 | 326 | } |
| kenjiArai | 0:166e0710d217 | 327 | } else if (code[0] == '-'){ // - |
| kenjiArai | 0:166e0710d217 | 328 | if (code[1] == '.'){ // -. |
| kenjiArai | 0:166e0710d217 | 329 | if (code[2] == '.'){ // -.. |
| kenjiArai | 0:166e0710d217 | 330 | if (code[3] == '.'){ // -... |
| kenjiArai | 0:166e0710d217 | 331 | if (strcmp(code,"-..." ) == 0){ printascii('B'); return;} |
| kenjiArai | 0:166e0710d217 | 332 | if (strcmp(code,"-...." ) == 0){ printascii('6'); return;} |
| kenjiArai | 0:166e0710d217 | 333 | if (strcmp(code,"-....-" ) == 0){ printascii(45); return;} |
| kenjiArai | 0:166e0710d217 | 334 | } else if (code[3] == '-'){ // -..- |
| kenjiArai | 0:166e0710d217 | 335 | if (strcmp(code,"-..-" ) == 0){ printascii('X'); return;} |
| kenjiArai | 0:166e0710d217 | 336 | if (strcmp(code,"-..-." ) == 0){ printascii(47); return;} |
| kenjiArai | 0:166e0710d217 | 337 | } else { |
| kenjiArai | 0:166e0710d217 | 338 | if (strcmp(code,"-.." ) == 0){ printascii('D'); return;} |
| kenjiArai | 0:166e0710d217 | 339 | } |
| kenjiArai | 0:166e0710d217 | 340 | } else if (code[2] == '-'){ // -.- |
| kenjiArai | 0:166e0710d217 | 341 | if (code[3] == '.'){ // -.-. |
| kenjiArai | 0:166e0710d217 | 342 | if (strcmp(code,"-.-." ) == 0){ printascii('C'); return;} |
| kenjiArai | 0:166e0710d217 | 343 | if (strcmp(code,"-.-.--" ) == 0){ printascii(33); return;} |
| kenjiArai | 0:166e0710d217 | 344 | } else if (code[3] == '-'){ // -.-- |
| kenjiArai | 0:166e0710d217 | 345 | if (strcmp(code,"-.--" ) == 0){ printascii('Y'); return;} |
| kenjiArai | 0:166e0710d217 | 346 | if (strcmp(code,"-.--." ) == 0){ printascii(40); return;} |
| kenjiArai | 0:166e0710d217 | 347 | if (strcmp(code,"-.--.-" ) == 0){ printascii(41); return;} |
| kenjiArai | 0:166e0710d217 | 348 | } else { // -.- |
| kenjiArai | 0:166e0710d217 | 349 | if (strcmp(code,"-.-" ) == 0){ printascii('K'); return;} |
| kenjiArai | 0:166e0710d217 | 350 | } |
| kenjiArai | 0:166e0710d217 | 351 | } else { // -. |
| kenjiArai | 0:166e0710d217 | 352 | if (strcmp(code,"-.") == 0){ printascii('N'); return;} |
| kenjiArai | 0:166e0710d217 | 353 | } |
| kenjiArai | 0:166e0710d217 | 354 | } else if (code[1] == '-'){ // - |
| kenjiArai | 0:166e0710d217 | 355 | if (code[2] == '.'){ // --. |
| kenjiArai | 0:166e0710d217 | 356 | if (strcmp(code,"--." ) == 0){ printascii('G'); return;} |
| kenjiArai | 0:166e0710d217 | 357 | if (strcmp(code,"--.." ) == 0){ printascii('Z'); return;} |
| kenjiArai | 0:166e0710d217 | 358 | if (strcmp(code,"--.-" ) == 0){ printascii('Q'); return;} |
| kenjiArai | 0:166e0710d217 | 359 | if (strcmp(code,"--..." ) == 0){ printascii('7'); return;} |
| kenjiArai | 0:166e0710d217 | 360 | if (strcmp(code,"--..--" ) == 0){ printascii(44); return;} |
| kenjiArai | 0:166e0710d217 | 361 | } else if (code[2] == '-'){ // --- |
| kenjiArai | 0:166e0710d217 | 362 | if (code[3] == '.'){ // ---. |
| kenjiArai | 0:166e0710d217 | 363 | if (strcmp(code,"---.." ) == 0){ printascii('8'); return;} |
| kenjiArai | 0:166e0710d217 | 364 | if (strcmp(code,"---." ) == 0){ printascii(4); return;} |
| kenjiArai | 0:166e0710d217 | 365 | if (strcmp(code,"---..." ) == 0){ printascii(58); return;} |
| kenjiArai | 0:166e0710d217 | 366 | } else if (code[3] == '-'){ // ---- |
| kenjiArai | 0:166e0710d217 | 367 | if (strcmp(code,"----." ) == 0){ printascii('9'); return;} |
| kenjiArai | 0:166e0710d217 | 368 | if (strcmp(code,"-----" ) == 0){ printascii('0'); return;} |
| kenjiArai | 0:166e0710d217 | 369 | } else { // --- |
| kenjiArai | 0:166e0710d217 | 370 | if (strcmp(code,"---" ) == 0){ printascii('O'); return;} |
| kenjiArai | 0:166e0710d217 | 371 | } |
| kenjiArai | 0:166e0710d217 | 372 | } else { // -- |
| kenjiArai | 0:166e0710d217 | 373 | if (strcmp(code,"--") == 0){ printascii('M'); return;} |
| kenjiArai | 0:166e0710d217 | 374 | } |
| kenjiArai | 0:166e0710d217 | 375 | } else { // - |
| kenjiArai | 0:166e0710d217 | 376 | if (strcmp(code,"-") == 0){ printascii('T'); return;} |
| kenjiArai | 0:166e0710d217 | 377 | } |
| kenjiArai | 0:166e0710d217 | 378 | } |
| kenjiArai | 0:166e0710d217 | 379 | } |
| kenjiArai | 0:166e0710d217 | 380 | |
| kenjiArai | 0:166e0710d217 | 381 | void printascii(char c){ |
| kenjiArai | 0:166e0710d217 | 382 | PUTC(c); |
| kenjiArai | 0:166e0710d217 | 383 | lcd.putc(c); |
| kenjiArai | 0:166e0710d217 | 384 | } |