エレキジャックweb mbed入門 mbed CWデコーダ 完成形です。CWd Ver1.0とします。細かなバグを修正してあります。デコーダ基板が必要です。

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 // CW13 = CWd Ver1.0
00002 // BT AR taiou
00003 // Wabun 
00004 // SW tuika
00005 // hore taiou
00006 // wabun (OUBUN) wabun
00007 // CQ hore taiou
00008 
00009 #include "mbed.h"
00010 #include "TextLCD0420.h"
00011 
00012 #define ON 1
00013 #define OFF 0
00014 #define XON 0
00015 #define XOFF 1
00016 #define XHI 0
00017 #define XLOW 1
00018 #define HI 1
00019 #define LOW
00020 #define OUBUN 1
00021 #define WABUN 0
00022 #define AUTO 1
00023 #define MANUAL 0
00024 #define KN 44
00025 #define AS 33
00026 #define CT 52
00027 #define BT 48
00028 #define AR 41
00029 #define HH 255
00030 #define VA 103
00031 #define HORE 120
00032 #define RATA 39
00033 
00034 DigitalOut mled1(LED1);
00035 DigitalOut mled2(LED2);
00036 DigitalOut mled3(LED3);
00037 DigitalOut mled4(LED4);
00038 DigitalIn CW(p5);
00039 DigitalIn SP_SELECT(p6);
00040 DigitalIn GENGO_MODE(p7);
00041 DigitalIn GENGO_SELECT(p8);
00042 
00043 TextLCD lcd(p24, p25, p26, p27, p28, p29, p30,20,4); // rs, rw, e, d0, d1, d2, d3
00044 
00045 int retu,gyou;
00046 char g2[20],g3[20];
00047 int init_flag=ON;
00048 int min_ms,max_ms;
00049 int gengo,wabun_temp; 
00050 
00051 void lcd_scprintf(char pdata){
00052   int i;
00053   
00054   if(init_flag==ON){
00055     if(gyou==1){
00056       lcd.locate(retu,1);
00057       lcd.printf("%c",pdata);
00058       retu++;
00059       if(retu==20){
00060         gyou=2;
00061         retu=0;
00062       }
00063     }
00064     else if(gyou==2){
00065       lcd.locate(retu,2);
00066       lcd.printf("%c",pdata);
00067       g2[retu]=pdata;
00068       retu++;
00069       if(retu==20){
00070         retu=0;
00071         gyou=3;
00072       }
00073     }
00074     else if(gyou==3){
00075       lcd.locate(retu,3);
00076       lcd.printf("%c",pdata);
00077       g3[retu]=pdata;
00078       retu++;
00079       if(retu==20){
00080         retu=0;
00081         gyou=1;
00082         for(i=0;i<20;i++){
00083           lcd.locate(i,1);
00084           lcd.printf("%c",g2[i]);
00085         }
00086         for(i=0;i<20;i++){
00087           lcd.locate(i,2);
00088           lcd.printf("%c",g3[i]);
00089           g2[i]=g3[i];
00090         }
00091         lcd.locate(0,3);
00092         lcd.printf("                    ");        
00093         init_flag=OFF;
00094       }
00095     }
00096   }
00097   if(init_flag==OFF){
00098       gyou=3;
00099       lcd.locate(retu,3);
00100       lcd.printf("%c",pdata); 
00101       g3[retu]=pdata; 
00102       retu++;     
00103       if(retu==20){
00104         for(i=0;i<20;i++){
00105           lcd.locate(i,1);
00106           lcd.printf("%c",g2[i]);
00107           lcd.locate(i,2);
00108           lcd.printf("%c",g3[i]);
00109           g2[i]=g3[i];
00110         }
00111         lcd.locate(0,3);
00112         lcd.printf("                    ");
00113         retu=0;
00114       }
00115   }
00116 }
00117 
00118 void set_speed(){
00119   if(SP_SELECT==HI){
00120     min_ms=30;
00121     max_ms=90;
00122     lcd.locate(5,0);
00123     lcd.printf("H");
00124   }
00125   else{
00126     min_ms=70;
00127     max_ms=210;
00128     lcd.locate(5,0);
00129     lcd.printf("L");
00130   }
00131 }
00132 
00133 void lcd_manual(){
00134   lcd.locate(6,0);
00135   lcd.printf("M");
00136 }
00137 
00138 void lcd_auto(){
00139   lcd.locate(6,0);
00140   lcd.printf("A");
00141 }   
00142 
00143 void lcd_alpha(){
00144   lcd.locate(7,0);
00145   lcd.printf("A");
00146 }
00147 void lcd_kana(){
00148   lcd.locate(7,0);
00149   lcd.printf("%c",0xb6);                 
00150 }
00151 
00152 void set_gengo(){
00153   if(GENGO_MODE==MANUAL){// Gengo Manual mode 
00154     lcd_manual();
00155     if(GENGO_SELECT==OUBUN){// manual wabun
00156       gengo=OUBUN;
00157     }
00158     else if(GENGO_SELECT==WABUN){// manual oubun
00159       gengo=WABUN;
00160       wabun_temp=WABUN;
00161     }
00162   }
00163   else if(GENGO_MODE==AUTO){// Gengo Auto mode
00164     lcd_auto();
00165   }
00166 }      
00167       
00168 int main() {      
00169   
00170   int i,j,k;
00171   int code[8];
00172   int scount;
00173   char mj[115],mjj[121],c1,c2;
00174   int cw_sum,tan_sum,tanten,cpm;
00175   char cw_class;
00176   
00177   // Alphabet
00178   for(i=0;i<115;i++){
00179     mj[i]=' ';
00180   }
00181   mj[5]='A';mj[16]='B';mj[20]='C';mj[8]='D';mj[1]='E';
00182   mj[19]='F';mj[10]='G';mj[15]='H';mj[3]='I';mj[29]='J';
00183   mj[12]='K';mj[17]='L';mj[6]='M';mj[4]='N';mj[14]='O';
00184   mj[21]='P';mj[26]='Q';mj[9]='R';mj[7]='S';mj[2]='T';
00185   mj[11]='U';mj[23]='V';mj[13]='W';mj[24]='X';mj[28]='Y';
00186   mj[18]='Z';
00187   mj[61]='1';mj[59]='2';mj[55]='3';mj[47]='4';mj[31]='5';
00188   mj[32]='6';mj[34]='7';mj[38]='8';mj[46]='9';mj[62]='0';
00189   mj[105]='.';mj[114]=',';mj[75]='?';mj[48]='=';mj[96]='-';
00190   mj[70]=':';mj[93]='\'';mj[44]='(';mj[108]=')';mj[40]='/';
00191   mj[85]='@';
00192   //mj[41]='+';
00193   
00194   // Kanamoji 
00195   for(i=0;i<121;i++){
00196     mjj[i]=' ';
00197   }
00198   mjj[58]=0xb1;mjj[5]=0xb2;mjj[11]=0xb3;mjj[60]=0xb4;mjj[33]=0xb5;//a 
00199   mjj[17]=0xb6;mjj[36]=0xb7;mjj[23]=0xb8;mjj[28]=0xb9;mjj[30]=0xba;//ka
00200   mjj[52]=0xbb;mjj[42]=0xbc;mjj[54]=0xbd;mjj[45]=0xbe;mjj[22]=0xbf;//sa
00201   mjj[4]=0xc0;mjj[19]=0xc1;mjj[21]=0xc2;mjj[57]=0xc3;mjj[35]=0xc4;//ta 
00202   mjj[9]=0xc5;mjj[20]=0xc6;mjj[15]=0xc7;mjj[26]=0xc8;mjj[27]=0xc9;//na
00203   mjj[16]=0xca;mjj[50]=0xcb;mjj[18]=0xcc;mjj[1]=0xcd;mjj[8]=0xce;//ha
00204   mjj[24]=0xcf;mjj[51]=0xd0;mjj[2]=0xd1;mjj[48]=0xd2;mjj[40]=0xd3;//ma
00205   mjj[13]=0xd4;mjj[56]=0xd5;mjj[6]=0xd6;//ya
00206   mjj[7]=0xd7;mjj[10]=0xd8;mjj[44]=0xd9;mjj[14]=0xda;mjj[25]=0xdb;//ra 
00207   mjj[12]=0xdc;mjj[49]=0xb2;mjj[37]=0xb4;mjj[29]=0xa6;mjj[41]=0xdd;//wa
00208   mjj[53]=0xb0;mjj[43]=0xdf;mjj[105]=',';
00209   mjj[3]=0xde;mjj[73]=0xa3; 
00210   mjj[108]='(';mjj[81]=')';
00211   mjj[61]='1';mjj[59]='2';mjj[55]='3';mjj[47]='4';mjj[31]='5';
00212   mjj[32]='6';mjj[34]='7';mjj[38]='8';mjj[46]='9';mjj[62]='0';
00213    
00214   lcd.cls();
00215   lcd.printf("*CWd  ");
00216   
00217   for(i=0;i<8;i++){
00218     code[i]=0;
00219   }
00220 
00221   i=0;
00222   tan_sum=0;
00223   set_speed();
00224   c1=' ',c2=' ';
00225   
00226   set_gengo();
00227   
00228   while( i<5 ){// System initialize
00229     lcd.locate(8,0);
00230     lcd.printf("%2d",5-i);
00231     scount=0;
00232     while(CW==XLOW){
00233     }
00234     mled1=ON;
00235     while(CW==XHI){
00236       scount++;
00237       wait_ms(1);
00238     }
00239     mled1=OFF;
00240     if(min_ms < scount && scount < max_ms){
00241       tan_sum=tan_sum+scount;
00242       i++;
00243     }
00244     
00245   }//while i  
00246   
00247   tanten=tan_sum/5;    
00248   
00249   j=0;
00250   k=0;
00251   tan_sum=0;
00252   gyou=1,retu=0;
00253   gengo=OUBUN;
00254   wabun_temp=OUBUN;
00255   while(1){
00256         set_speed();// speed Hi/LO
00257         set_gengo();
00258         while(CW==XLOW){// signal Low wait
00259         }       
00260         
00261         scount=0;  
00262         mled1=ON;
00263         while(CW==XHI){// ._ count
00264           wait_ms(1);
00265           scount++;
00266         }
00267         mled1=OFF;
00268         
00269         if(min_ms < scount && scount < max_ms){ 
00270           //lcd.printf(".");
00271           code[k]=1;
00272           k++;
00273           tan_sum=tan_sum+scount;
00274           j++;
00275         }
00276 
00277         else if ( scount > tanten*2.0){
00278           //lcd.printf("_");
00279           code[k]=2;
00280           k++;
00281           tan_sum=tan_sum+scount/3;
00282           j++;
00283         }
00284         
00285         lcd.locate(8,0);// moji kousei status
00286         lcd.printf("%2d",k);
00287                  
00288         scount=0;
00289         while(CW==XLOW){
00290           wait_ms(1);
00291           scount++;
00292           if(scount > tanten*10){
00293             break;
00294           }
00295         }
00296         
00297         if(k>8){// moji kousei over flow
00298           k=0;
00299           lcd_scprintf('*');
00300           for(i=0;i<=7;i++){
00301             code[i]=0;
00302           }
00303         }
00304 
00305         if(gengo==OUBUN &&  scount > tanten*2.0){// Oubun shori 
00306           lcd_alpha();
00307           cw_sum=0;
00308           for(i=0;i<=7;i++){ 
00309               cw_sum=cw_sum+code[i]*int(pow(2.0,i));
00310           }          
00311           
00312           if(GENGO_MODE==AUTO && (cw_sum==HORE || cw_sum==58 ||cw_sum==28 || cw_sum==33 || cw_sum==36 
00313                                       || cw_sum==30 ||cw_sum==25) ){// hore a e o ki ko ro
00314             lcd_scprintf('[');lcd_scprintf(0xce);lcd_scprintf( 0xda);lcd_scprintf(']');//ho re
00315             if(c1=='C' && c2=='Q'){// CQ hore oubun keep
00316               //
00317             }
00318             else{
00319               gengo=WABUN;
00320               wabun_temp=WABUN;
00321               cw_sum=0;
00322             }
00323           }// if gengo auto 
00324           else if(cw_sum==BT){
00325             lcd_scprintf('[');lcd_scprintf('B');lcd_scprintf('T');lcd_scprintf(']');
00326           }
00327           else if(cw_sum==KN){
00328             lcd_scprintf('[');lcd_scprintf('K');lcd_scprintf('N');lcd_scprintf(']');
00329           }
00330           else if(cw_sum==AR){
00331             lcd_scprintf('[');lcd_scprintf('A');lcd_scprintf('R');lcd_scprintf(']');
00332           }
00333           else if(cw_sum==HH){
00334             lcd_scprintf('[');lcd_scprintf('H');lcd_scprintf('H');lcd_scprintf(']');
00335           }
00336           else if(cw_sum==AS){
00337             lcd_scprintf('[');lcd_scprintf('A');lcd_scprintf('S');lcd_scprintf(']');
00338           }
00339           else if(cw_sum==CT){
00340             lcd_scprintf('[');lcd_scprintf('C');lcd_scprintf('T');lcd_scprintf(']');
00341           }
00342           else if(cw_sum==VA){
00343             lcd_scprintf('[');lcd_scprintf('V');lcd_scprintf('A');lcd_scprintf(']');
00344           }
00345           else if(cw_sum > 115){
00346             lcd_scprintf('*');
00347             cw_sum=0;
00348           }
00349           else { 
00350             lcd_scprintf(mj[cw_sum]);
00351             c1=c2;// CQ hore taiou
00352             c2=mj[cw_sum];
00353           }
00354           k=0;
00355           for(i=0;i<=7;i++){
00356             code[i]=0;
00357           }
00358         }//if oubun        
00359         
00360        if(gengo==WABUN && scount > tanten*2.0){// Wabun shori 
00361           lcd_kana();
00362           cw_sum=0;
00363           for(i=0;i<=7;i++){
00364               cw_sum=cw_sum+code[i]*int(pow(2.0,i));
00365           }
00366 
00367           if(GENGO_MODE==AUTO && cw_sum==RATA){// ra ta
00368             lcd_scprintf('[');lcd_scprintf(0xd7);lcd_scprintf(0xc0);lcd_scprintf(']');//ra ta
00369             gengo=OUBUN;
00370             wabun_temp=OUBUN;
00371           }   
00372           if(cw_sum==81){// )
00373             wabun_temp=WABUN;
00374             lcd_kana();
00375            }
00376           else if(cw_sum > 121){
00377             cw_sum=0;
00378             lcd_scprintf(' ');
00379           }
00380           
00381           if(wabun_temp==WABUN){   
00382             lcd_scprintf(mjj[cw_sum]);
00383             c1=c2;//CQ hore taiou
00384             c2=mjj[cw_sum]; 
00385           }
00386           else if(wabun_temp==OUBUN){
00387             lcd_scprintf(mj[cw_sum]);
00388             c1=c2;//CQ hore taiou
00389             c2=mj[cw_sum];
00390           }
00391           
00392           if(cw_sum==108){// (
00393             wabun_temp=OUBUN;
00394             lcd_alpha();
00395           }
00396 
00397           k=0;
00398           for(i=0;i<=7;i++){
00399             code[i]=0;
00400           }
00401         }//if wabun
00402         
00403         if(scount > tanten*7){// tango kan space
00404           lcd_scprintf(' ');
00405         }
00406         
00407         if(j==10){// ._ nagasa heikin keisan 
00408           tanten=tan_sum/10;
00409           cpm=60000/(tanten*57)*5;
00410           tan_sum=0;
00411           j=0;
00412           if(cpm > 100){// Professional
00413             cw_class='P';
00414           }
00415           else if(cpm > 90){ // Special
00416             cw_class='S';
00417           }
00418           else if(cpm > 65){// 1ama
00419             cw_class='1';
00420           }
00421           else if(cpm > 40){// 2ama
00422             cw_class='2';
00423           }
00424           else if(cpm > 30){//3 ama
00425             cw_class='3';
00426           }
00427           lcd.locate(11,0);
00428           lcd.printf("%3dc(%c)",cpm,cw_class);// cw class hantei
00429           //lcd.printf("%3dc,%3dm",cpm,tanten);
00430         }
00431   }//while 1
00432 }//main