Kenji Arai / Mbed OS cwdecoder_Goertzel_on_mbed-os

Dependencies:   TextLCD

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?

UserRevisionLine numberNew 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 }