adf7021

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include <mbed.h>
00002 Serial pc(USBTX, USBRX,921600);
00003 Serial device( p9, p10, 9600);
00004 #define kHz 1000
00005 #define MHz 1000000
00006 #define PFD 19.68
00007 LocalFileSystem local("local");
00008 
00009 class calsat32
00010 {
00011 public:
00012     int Fractional_N;
00013     int Integer_N;
00014     int intbin[8];
00015     int decbin[15];
00016     int register_data;//レジスタへ入れるファイルから読み込んだ10進数の値
00017     int length; //値の長さ
00018     int size;//累計の長さこれが32となったら1つのレジスタの設定が完了として次のレジスタの設定へ移る
00019     int register_num;//レジスタ番号
00020     int buf;
00021 
00022     const char* filename;
00023     FILE *fp;
00024 
00025     calsat32()
00026     {
00027         Fractional_N = 0;
00028         Integer_N = 0;
00029         register_data = 0;//レジスタへ入れる1ファイルから読み込んだ10進数の値
00030         length = 0; //値の長さ
00031         size = 0;//累計の長さこれが32となったら1つのレジスタの設定が完了として次のレジスタの設定へ移る
00032         register_num = 1;//レジスタ番号
00033         filename = "/local/register_set_1.txt";
00034     }
00035     //main関数内でコマンドが0x00の時にmainでbinary()を呼ぶと計算をしてuint_32型の値を返す
00036 
00037     void Shift_bit(uint32_t& Register, int Register_data, int Size)
00038     {
00039         Register |= (Register_data << Size);
00040     }
00041 
00042     void file_read(char* command)
00043     {
00044         /* ファイルのオープン */
00045         char name[100] = {};//出力はしない
00046         if ((fp = fopen("/local/register.txt", "r")) == NULL) {
00047             fprintf(stderr, "%sのオープンに失敗しました.\r\n", filename);
00048             exit(EXIT_FAILURE);
00049         }
00050 
00051         /* ファイルの終端まで文字を読み取り表示する */
00052         int num[5] = {1,3,0,5,4};
00053         int l = 1;//行数
00054         uint32_t _register = 0;//最終的に欲しいレジスタの値.32ビット
00055         while ( fscanf(fp,"%[^,],%d,%d%d",name, &register_data,&length,&buf) != EOF ) {
00056             if(l == 1 || l == 14 || l == 21 || l == 26 || l == 36)
00057                 l++;
00058 
00059             else {
00060                 printf("%d %d \r\n",register_data, length );
00061 
00062                 //レジスタ0にcalsatから受け取った値を格納するとき
00063                 if(register_num == 3 && size == 4 ) { 
00064                     Shift_bit(_register, binary(command), 4);
00065                     size = 27;
00066                 }
00067 
00068                 //テキストファイルから受け取った値を格納するとき
00069                 Shift_bit(_register, register_data, size);
00070                 size += length;
00071                 if(register_num == 1 && size == 26) {
00072                     printf(" = reg_%d ",num[register_num - 1]);
00073                     show(_register);
00074                     register_num++;
00075                     _register = 0;
00076                     size = 0;
00077                 }
00078                 if(size == 32) {
00079                     //これで一つ完成.この値をどういう風にやるかは未定show()みたいなのを作るか?
00080                     printf(" = reg_%d ",num[register_num - 1]);
00081                     show(_register);
00082                     register_num++;
00083                     _register = 0;
00084                     size = 0;
00085 
00086                 }
00087                 //printf("%s %d %d\n",name,register_data,length);
00088                 l++;
00089             }
00090         }
00091         /* ファイルのクローズ */
00092         fclose(fp);
00093     }
00094 
00095     uint32_t binary(char* command)
00096     {
00097         double  RFout = doppler(command);
00098         double n = RFout * 2 / PFD;
00099         Integer_N = (int)n;
00100         double test = (n - (int)n);
00101         Fractional_N = test*32768;
00102 
00103         uint32_t data = Fractional_N;
00104         return data |= (Integer_N << 15);//レジスタ入力に適した形にした23桁の2進数を返す
00105     }
00106     //データを取得し返す関数
00107     double doppler(char *a)
00108     {
00109         int data[10] = {0};
00110         double doppler_data = 0;
00111         int flag = 0;
00112         for(int i = 5; i < 10; i++) {
00113             char c = a[i];
00114             data[flag] = (c >> 4) & 0xf;
00115             data[flag+1] = c & 0xf;
00116             flag += 2;
00117         }
00118 
00119         doppler_data = 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
00120         printf("\n%lf\r\n",doppler_data / 1000000); //Mhz
00121 
00122         return doppler_data / 1000000;
00123     }
00124     void show(uint32_t bin)
00125     {
00126         for(int i = 32; i > 0; i--) {
00127             if(bin & (1 << (i - 1))) {
00128                 pc.printf("1");
00129             } else {
00130                 pc.printf("0");
00131             }
00132         }
00133         printf("\r\n");
00134     }
00135 
00136 };
00137 
00138 int main()
00139 {
00140     while(1) {
00141         char c = device.getc();
00142 
00143         if(c == 0xfe) { //FEコマンドがきたらdataが始まる
00144 
00145             char command[128] = {};
00146             while(1) {
00147                 command[0] = c;
00148                 int i = 1;
00149                 calsat32 a;
00150                 while(c != 0xfd) {
00151                     c = device.getc();
00152                     command[i] = c;
00153                     i++;
00154                 }
00155                 for(int j = 0; j < i; j++)
00156                     printf("%02hhx",command[j]);
00157                 printf("\r\n");
00158                 //ここまでで一旦プリアンブルからポストアンブルまでをcommandに格納する
00159                 if(command[4] == 0x00 )
00160                     a.file_read(command);
00161                 break;
00162             }
00163         }
00164 
00165     }
00166     return 0;
00167 }