米川君が見るやつ

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include <mbed.h>
00002 #include <stdio.h>
00003 #include <stdlib.h>
00004 Serial pc(USBTX, USBRX,921600);
00005 Serial device( p9, p10, 9600);
00006 #define kHz 1000
00007 #define MHz 1000000
00008 #define PFD 19.68
00009 LocalFileSystem local("local");
00010 #pragma diag_suppress 870
00011 class calsat32
00012 {
00013 public:
00014     int Fractional_N;
00015     int Integer_N;
00016     int intbin[8];
00017     int decbin[15];
00018     int register_data;//レジスタへ入れるファイルから読み込んだ10進数の値
00019     int length; //値の長さ
00020     int size;//累計の長さこれが32となったら1つのレジスタの設定が完了として次のレジスタの設定へ移る
00021     int register_num;//レジスタ番号
00022     int buf;
00023     char _command[128];
00024     double human_freq; //人から受け取る周波数の値
00025     uint32_t _register;//最終的に欲しいレジスタの値.32ビット
00026     uint32_t register_data_array[16];//完成したレジスターを格納する配列
00027     const char* filename;
00028     FILE *fp;
00029     calsat32()
00030     {
00031         Fractional_N = 0;
00032         Integer_N = 0;
00033         register_data = 0;//レジスタへ入れる1ファイルから読み込んだ10進数の値
00034         length = 0; //値の長さ
00035         size = 0;//累計の長さこれが32となったら1つのレジスタの設定が完了として次のレジスタの設定へ移る
00036         register_num = 1;//レジスタ番号
00037         filename = "/local/register.tsv";
00038         _register = 0;
00039         human_freq = 0;
00040     }
00041     //main関数内でコマンドが0x00の時にmainでbinary()を呼ぶと計算をしてuint_32型の値を返す
00042     uint32_t Reg0_gen(int key,double calsat_freq,double human_freq )
00043     {
00044         //printf("%lf %lf\r\n",calsat_freq,human_freq);
00045         uint32_t freq_bit;
00046         
00047         if(key == '0') {
00048             printf("key = 0");
00049             uint32_t tmp = 0;
00050             tmp |= ( register_data_array[2] >> 27); //この行と次の行でレジスタのデータの部分を全て0にしている
00051             tmp |= (tmp << 27);
00052             printf("tmp = ");
00053             for(int i = 27; i > 0; i--) {
00054                 if(tmp & (1 << (i - 1))) {
00055                     pc.printf("1");
00056                 } else {
00057                     pc.printf("0");
00058                 }
00059             }
00060             printf("\r\n");
00061             freq_bit = binary(calsat_freq);
00062             freq_bit = freq_bit<<4;
00063             printf("freq_bit = ");
00064             for(int i = 27; i > 0; i--) {
00065                 if(tmp & (1 << (i - 1))) {
00066                     pc.printf("1");
00067                 } else {
00068                     pc.printf("0");
00069                 }
00070             }
00071             printf("\r\n");
00072             tmp |= freq_bit;
00073             register_data_array[2] = tmp;
00074             printf("reg2=");
00075             for(int i = 27; i > 0; i--) {
00076                 if(tmp & (1 << (i - 1))) {
00077                     pc.printf("1");
00078                 } else {
00079                     pc.printf("0");
00080                 }
00081             }
00082            printf("\r\n");
00083         } else if(key == '1') {
00084             
00085             freq_bit = binary(calsat_freq);
00086             freq_bit = freq_bit<<4;
00087 
00088         } else if(key =='2') { //calsatから受けとる
00089             freq_bit = binary(human_freq);
00090             freq_bit = freq_bit<<4;
00091         }
00092         /*else if(key == '3' ) {
00093              uint32_t tmp = 0;
00094              tmp |= ( register_data_array[2] >> 27); //この行と次の行でレジスタのデータの部分を全て0にしている
00095              tmp |= (tmp << 27);
00096 
00097              Shift_bit(tmp, binary(human_freq), 4);//人間が入力した周波数の値を用いたレジスタを作成する
00098              register_data_array[2] = tmp;//配列の中に格納する
00099              show_all();
00100              */
00101         else {}
00102         
00103 
00104         /* for(int i = 23; i > 0; i--) {
00105           if(freq_bit & (1 << (i - 1))) {
00106               pc.printf("1");
00107           } else {
00108               pc.printf("0");
00109           }
00110         }
00111         printf("\r\n");*/
00112         for(int i = 27; i > 0; i--) {
00113             if(freq_bit & (1 << (i - 1))) {
00114                 pc.printf("1");
00115             } else {
00116                 pc.printf("0");
00117             }
00118         }
00119 
00120         printf("\r\n");
00121         return freq_bit;
00122 
00123     }
00124     void Shift_bit(uint32_t& Register, int Register_data, int Size)
00125     {
00126         Register |= (Register_data << Size);
00127     }
00128     void file_read(char key,double calsat_freq)
00129     {
00130         /* ファイルのオープン */
00131         char name[100] = {};//出力はしない
00132         if ((fp = fopen("/local/register.tsv", "r")) == NULL) {
00133             fprintf(stderr, "%sのオープンに失敗しました.\r\n", filename);
00134             exit(EXIT_FAILURE);
00135         }
00136         /* ファイルの終端まで文字を読み取り表示する */
00137         int num[5] = {1,3,0,5,4};
00138         int l = 1;//行数
00139         uint32_t _register = 0;//最終的に欲しいレジスタの値.32ビット
00140         while ( fscanf(fp,"%s%d%d%d",name, &register_data,&length,&buf) != EOF ) {
00141             if(l == 1 || l == 14  || l == 21 ||l == 27 || l == 37) {
00142                 printf("%d\r\n",l);
00143                 l++;
00144             } else {
00145                 printf(" %d %d   %d \r\n",register_data, length,size);
00146                 if(l==23) {
00147                     /*if(key == '1')
00148                     Shift_bit(_register, binary(calsat_freq), 4);
00149                     if(key == '2')*/
00150                     human_freq = register_data;
00151                     // Shift_bit(_register, binary(register_data), 4);
00152                     _register = Reg0_gen(key, calsat_freq, human_freq );
00153 
00154                     for(int i = 27; i > 0; i--) {//デバッグ用
00155                         if(_register & (1 << (i - 1))) {
00156                             pc.printf("1");
00157                         } else {
00158                             pc.printf("0");
00159                         }
00160                     }
00161                     printf("\r\n");
00162                     size = 27;
00163                     //テキストファイルから受け取った値を格納するとき
00164                 } else {
00165                     Shift_bit(_register, register_data, size);
00166                     size += length;
00167                     if(register_num == 1 && size == 26) {
00168                         printf(" = reg_%d ",num[register_num - 1]);
00169                         show(_register);
00170                         register_num++;
00171                         //_register = 0;
00172                         size = 0;
00173                     }
00174                     if(size == 32) {
00175                         //これで一つ完成.
00176                         printf(" = reg_%d ",num[register_num - 1]);
00177                         show(_register);
00178                         register_num++;
00179                         _register = 0;
00180                         size = 0;
00181                     }
00182                 }
00183                 l++;
00184             }
00185         }
00186         /* ファイルのクローズ */
00187         fclose(fp);
00188     }
00189     uint32_t binary(double  RFout)
00190     {
00191         double n = RFout * 2 / PFD;
00192         Integer_N = (int)n;
00193         double test = (n - (int)n);
00194         Fractional_N = test*32768;
00195         uint32_t data = Fractional_N;
00196         return data |= (Integer_N << 15);//レジスタ入力に適した形にした23桁の2進数を返す
00197     }
00198     //データを取得し返す関数
00199     double doppler(char *a)
00200     {
00201         int data[10] = {0};
00202         double calsat_freq  = 0;
00203         int flag = 0;
00204         for(int i = 5; i < 10; i++) {
00205             char c = a[i];
00206             data[flag] = (c >> 4) & 0xf;
00207             data[flag+1] = c & 0xf;
00208             flag += 2;
00209         }
00210         calsat_freq = 10 * data[0] + data[1] + kHz * data[2] + 100 * data[3] + 100*kHz * data[4] + 10*kHz * data[5] + 10*MHz * data[6] + MHz * data[7] + data[8] + 100*MHz * data[9];//Hz
00211         printf("\n%lf\r\n",calsat_freq / 1000000); //Mhz
00212         return calsat_freq / 1000000;
00213     }
00214     void show(uint32_t bin)
00215     {
00216         static int reg_num = 0;
00217         //表示フェーズ
00218         for(int i = 32; i > 0; i--) {
00219             if(bin & (1 << (i - 1))) {
00220                 pc.printf("1");
00221             } else {
00222                 pc.printf("0");
00223             }
00224         }
00225         printf("\r\n");
00226         //格納フェーズ
00227         register_data_array[reg_num] = bin;
00228         reg_num++;
00229         if(reg_num == 4) {
00230             reg_num = 0;
00231         }
00232     }
00233     void show_all()//完成したレジスタの値を出力
00234     {
00235         for(int j = 0; j < 5; j++) {
00236             for(int i = 32; i > 0; i--) {
00237                 if(register_data_array[j] & (1 << (i - 1))) {
00238                     pc.printf("1");
00239                 } else {
00240                     pc.printf("0");
00241                 }
00242             }
00243             printf("\r\n");
00244         }
00245     }
00246     double packet(char c)
00247     {
00248         static int a = 0;
00249         double calsat_freq;
00250         _command[a] = c;
00251         a++;
00252         if(_command[a-1] == 0xfd) {
00253             calsat_freq = doppler(_command);
00254             _register = Reg0_gen(0, calsat_freq, human_freq); //reg0をcalsatの値で更新
00255             /*
00256             for(int j = 0; j < a; j++)
00257                 printf("%02hhx",_command[j]);
00258             printf("\r\n");
00259             */
00260             a = 0;
00261         }
00262         return calsat_freq;
00263     }
00264     void check(char key,double calsat_freq)
00265     {
00266         printf("key = %c\r\n",key);
00267         if(_command[4] == 0x00) {
00268             printf("---------------------------Start-----------------------------\r\n");
00269             file_read(key,calsat_freq);
00270         }
00271     }
00272 };
00273 int main()
00274 {
00275     Serial device( p9, p10, 9600);
00276     printf("Start\r\n");
00277     while(1) {
00278         calsat32 tmp;
00279         while(device.readable()) {
00280 
00281             char c = device.getc();
00282             double calsat_freq = tmp.packet(c);
00283             if(pc.readable()) {
00284                 char key = pc.getc();
00285                 if(key == '1' ||key == '2') {
00286                     tmp.check(key,calsat_freq);
00287                     //file読み込み、calsator人の更新
00288                 } else if(key == '3') //reg0を人にする
00289                     tmp.check(key,calsat_freq);
00290                     else if(key == '0') //reg0を人にする
00291                     tmp.check(key,calsat_freq);
00292             }
00293         }
00294     }
00295     return 0;
00296 }