doppler shift / Mbed 2 deprecated Register_set_16_5

Dependencies:   mbed

Committer:
KINU
Date:
Mon Mar 22 03:55:57 2021 +0000
Revision:
2:0a0b5c62d10c
Parent:
1:515864d13410
ddddd

Who changed what in which revision?

UserRevisionLine numberNew contents of line
KINU 0:4f081a382f9b 1 #include <mbed.h>
KINU 0:4f081a382f9b 2 #include <stdio.h>
KINU 0:4f081a382f9b 3 #include <stdlib.h>
KINU 0:4f081a382f9b 4 Serial pc(USBTX, USBRX,921600);
KINU 0:4f081a382f9b 5 Serial device( p9, p10, 9600);
KINU 0:4f081a382f9b 6 #define kHz 1000
KINU 0:4f081a382f9b 7 #define MHz 1000000
KINU 0:4f081a382f9b 8 #define PFD 19.68
KINU 0:4f081a382f9b 9 LocalFileSystem local("local");
KINU 0:4f081a382f9b 10 #pragma diag_suppress 870
KINU 0:4f081a382f9b 11 class calsat32
KINU 0:4f081a382f9b 12 {
KINU 0:4f081a382f9b 13 public:
KINU 0:4f081a382f9b 14 int Fractional_N;
KINU 0:4f081a382f9b 15 int Integer_N;
KINU 0:4f081a382f9b 16 int intbin[8];
KINU 0:4f081a382f9b 17 int decbin[15];
KINU 0:4f081a382f9b 18 int register_data;//レジスタへ入れるファイルから読み込んだ10進数の値
KINU 0:4f081a382f9b 19 int length; //値の長さ
KINU 0:4f081a382f9b 20 int size;//累計の長さこれが32となったら1つのレジスタの設定が完了として次のレジスタの設定へ移る
KINU 0:4f081a382f9b 21 int register_num;//レジスタ番号
KINU 0:4f081a382f9b 22 int buf;
KINU 0:4f081a382f9b 23 char _command[128];
KINU 1:515864d13410 24 double human_freq; //人から受け取る周波数の値
KINU 0:4f081a382f9b 25 uint32_t _register;//最終的に欲しいレジスタの値.32ビット
KINU 2:0a0b5c62d10c 26 uint32_t register_data_array[16];//完成したレジスターを格納する配列
KINU 0:4f081a382f9b 27 const char* filename;
KINU 0:4f081a382f9b 28 FILE *fp;
KINU 0:4f081a382f9b 29 calsat32()
KINU 0:4f081a382f9b 30 {
KINU 0:4f081a382f9b 31 Fractional_N = 0;
KINU 0:4f081a382f9b 32 Integer_N = 0;
KINU 0:4f081a382f9b 33 register_data = 0;//レジスタへ入れる1ファイルから読み込んだ10進数の値
KINU 0:4f081a382f9b 34 length = 0; //値の長さ
KINU 0:4f081a382f9b 35 size = 0;//累計の長さこれが32となったら1つのレジスタの設定が完了として次のレジスタの設定へ移る
KINU 0:4f081a382f9b 36 register_num = 1;//レジスタ番号
KINU 0:4f081a382f9b 37 filename = "/local/register.tsv";
KINU 0:4f081a382f9b 38 _register = 0;
KINU 1:515864d13410 39 human_freq = 0;
KINU 0:4f081a382f9b 40 }
KINU 0:4f081a382f9b 41 //main関数内でコマンドが0x00の時にmainでbinary()を呼ぶと計算をしてuint_32型の値を返す
KINU 2:0a0b5c62d10c 42 void Reg0_gen(int key,double calsat_freq,double human_freq ,uint32_t _register){
KINU 2:0a0b5c62d10c 43
KINU 1:515864d13410 44 if(key == '1') {
KINU 2:0a0b5c62d10c 45 //printf("%lf %lf\r\n",calsat_freq,human_freq);
KINU 2:0a0b5c62d10c 46 Shift_bit(_register, binary(calsat_freq), 23);
KINU 0:4f081a382f9b 47 }
KINU 1:515864d13410 48 else if(key =='2'){ //calsatから受けとる
KINU 2:0a0b5c62d10c 49 Shift_bit(_register, binary(human_freq), 23);//1の時calsat,2の時人
KINU 0:4f081a382f9b 50 }
KINU 1:515864d13410 51 /*else if(key == '3' || key == '0') {
KINU 0:4f081a382f9b 52 uint32_t tmp = 0;
KINU 0:4f081a382f9b 53 tmp |= ( register_data_array[2] >> 27); //この行と次の行でレジスタのデータの部分を全て0にしている
KINU 0:4f081a382f9b 54 tmp |= (tmp << 27);
KINU 0:4f081a382f9b 55 if(key == 3){
KINU 1:515864d13410 56 Shift_bit(tmp, binary(human_freq), 4);//人間が入力した周波数の値を用いたレジスタを作成する
KINU 0:4f081a382f9b 57 register_data_array[2] = tmp;//配列の中に格納する
KINU 0:4f081a382f9b 58 show_all();
KINU 1:515864d13410 59 }*/
KINU 1:515864d13410 60 else {}
KINU 2:0a0b5c62d10c 61
KINU 2:0a0b5c62d10c 62 for(int i = 27; i > 0; i--) {
KINU 2:0a0b5c62d10c 63 if(_register & (1 << (i - 1))) {
KINU 2:0a0b5c62d10c 64 pc.printf("1");
KINU 2:0a0b5c62d10c 65 } else {
KINU 2:0a0b5c62d10c 66 pc.printf("0");
KINU 2:0a0b5c62d10c 67 }
KINU 2:0a0b5c62d10c 68 }
KINU 2:0a0b5c62d10c 69 //show(_register);
KINU 2:0a0b5c62d10c 70 printf("\r\n");
KINU 2:0a0b5c62d10c 71
KINU 1:515864d13410 72 }
KINU 0:4f081a382f9b 73 void Shift_bit(uint32_t& Register, int Register_data, int Size)
KINU 0:4f081a382f9b 74 {
KINU 0:4f081a382f9b 75 Register |= (Register_data << Size);
KINU 0:4f081a382f9b 76 }
KINU 1:515864d13410 77 void file_read(char key ,double calsat_freq)
KINU 0:4f081a382f9b 78 {
KINU 0:4f081a382f9b 79 /* ファイルのオープン */
KINU 0:4f081a382f9b 80 char name[100] = {};//出力はしない
KINU 0:4f081a382f9b 81 if ((fp = fopen("/local/register.tsv", "r")) == NULL) {
KINU 0:4f081a382f9b 82 fprintf(stderr, "%sのオープンに失敗しました.\r\n", filename);
KINU 0:4f081a382f9b 83 exit(EXIT_FAILURE);
KINU 0:4f081a382f9b 84 }
KINU 0:4f081a382f9b 85 /* ファイルの終端まで文字を読み取り表示する */
KINU 0:4f081a382f9b 86 int num[5] = {1,3,0,5,4};
KINU 0:4f081a382f9b 87 int l = 1;//行数
KINU 0:4f081a382f9b 88 uint32_t _register = 0;//最終的に欲しいレジスタの値.32ビット
KINU 0:4f081a382f9b 89 while ( fscanf(fp,"%s%d%d%d",name, &register_data,&length,&buf) != EOF ) {
KINU 0:4f081a382f9b 90 if(l == 1 || l == 14 || l == 21 ||l == 27 || l == 37) {
KINU 0:4f081a382f9b 91 printf("%d\r\n",l);
KINU 0:4f081a382f9b 92 l++;
KINU 0:4f081a382f9b 93 } else {
KINU 0:4f081a382f9b 94 printf(" %d %d %d \r\n",register_data, length,size);
KINU 0:4f081a382f9b 95 if(l==23) {
KINU 1:515864d13410 96 /*if(key == '1')
KINU 1:515864d13410 97 Shift_bit(_register, binary(calsat_freq), 4);
KINU 1:515864d13410 98 if(key == '2')*/
KINU 1:515864d13410 99 human_freq = register_data;
KINU 2:0a0b5c62d10c 100 // Shift_bit(_register, binary(register_data), 4);
KINU 2:0a0b5c62d10c 101 Reg0_gen(key, calsat_freq, human_freq, _register);
KINU 0:4f081a382f9b 102 size = 27;
KINU 0:4f081a382f9b 103 //テキストファイルから受け取った値を格納するとき
KINU 0:4f081a382f9b 104 } else {
KINU 0:4f081a382f9b 105 Shift_bit(_register, register_data, size);
KINU 0:4f081a382f9b 106 size += length;
KINU 0:4f081a382f9b 107 if(register_num == 1 && size == 26) {
KINU 0:4f081a382f9b 108 printf(" = reg_%d ",num[register_num - 1]);
KINU 0:4f081a382f9b 109 show(_register);
KINU 0:4f081a382f9b 110 register_num++;
KINU 2:0a0b5c62d10c 111 //_register = 0;
KINU 0:4f081a382f9b 112 size = 0;
KINU 0:4f081a382f9b 113 }
KINU 0:4f081a382f9b 114 if(size == 32) {
KINU 2:0a0b5c62d10c 115 //これで一つ完成.
KINU 0:4f081a382f9b 116 printf(" = reg_%d ",num[register_num - 1]);
KINU 0:4f081a382f9b 117 show(_register);
KINU 0:4f081a382f9b 118 register_num++;
KINU 0:4f081a382f9b 119 _register = 0;
KINU 0:4f081a382f9b 120 size = 0;
KINU 0:4f081a382f9b 121 }
KINU 0:4f081a382f9b 122 }
KINU 0:4f081a382f9b 123 l++;
KINU 0:4f081a382f9b 124 }
KINU 0:4f081a382f9b 125 }
KINU 0:4f081a382f9b 126 /* ファイルのクローズ */
KINU 0:4f081a382f9b 127 fclose(fp);
KINU 0:4f081a382f9b 128 }
KINU 0:4f081a382f9b 129 uint32_t binary(double RFout)//char* command
KINU 0:4f081a382f9b 130 {
KINU 0:4f081a382f9b 131 // = doppler(command);
KINU 0:4f081a382f9b 132 double n = RFout * 2 / PFD;
KINU 0:4f081a382f9b 133 Integer_N = (int)n;
KINU 0:4f081a382f9b 134 double test = (n - (int)n);
KINU 0:4f081a382f9b 135 Fractional_N = test*32768;
KINU 0:4f081a382f9b 136 uint32_t data = Fractional_N;
KINU 0:4f081a382f9b 137 return data |= (Integer_N << 15);//レジスタ入力に適した形にした23桁の2進数を返す
KINU 0:4f081a382f9b 138 }
KINU 0:4f081a382f9b 139 //データを取得し返す関数
KINU 0:4f081a382f9b 140 double doppler(char *a)
KINU 0:4f081a382f9b 141 {
KINU 0:4f081a382f9b 142 int data[10] = {0};
KINU 1:515864d13410 143 double calsat_freq = 0;
KINU 0:4f081a382f9b 144 int flag = 0;
KINU 0:4f081a382f9b 145 for(int i = 5; i < 10; i++) {
KINU 0:4f081a382f9b 146 char c = a[i];
KINU 0:4f081a382f9b 147 data[flag] = (c >> 4) & 0xf;
KINU 0:4f081a382f9b 148 data[flag+1] = c & 0xf;
KINU 0:4f081a382f9b 149 flag += 2;
KINU 0:4f081a382f9b 150 }
KINU 1:515864d13410 151 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
KINU 2:0a0b5c62d10c 152 printf("\n%lf\r\n",calsat_freq / 1000000); //Mhz
KINU 1:515864d13410 153 return calsat_freq / 1000000;
KINU 0:4f081a382f9b 154 }
KINU 0:4f081a382f9b 155 void show(uint32_t bin)
KINU 0:4f081a382f9b 156 {
KINU 0:4f081a382f9b 157 static int reg_num = 0;
KINU 0:4f081a382f9b 158 //表示フェーズ
KINU 0:4f081a382f9b 159 for(int i = 32; i > 0; i--) {
KINU 0:4f081a382f9b 160 if(bin & (1 << (i - 1))) {
KINU 0:4f081a382f9b 161 pc.printf("1");
KINU 0:4f081a382f9b 162 } else {
KINU 0:4f081a382f9b 163 pc.printf("0");
KINU 0:4f081a382f9b 164 }
KINU 0:4f081a382f9b 165 }
KINU 0:4f081a382f9b 166 printf("\r\n");
KINU 0:4f081a382f9b 167 //格納フェーズ
KINU 0:4f081a382f9b 168 register_data_array[reg_num] = bin;
KINU 0:4f081a382f9b 169 reg_num++;
KINU 0:4f081a382f9b 170 if(reg_num == 4) {
KINU 0:4f081a382f9b 171 reg_num = 0;
KINU 0:4f081a382f9b 172 }
KINU 0:4f081a382f9b 173 }
KINU 0:4f081a382f9b 174 void show_all()//完成したレジスタの値を出力
KINU 0:4f081a382f9b 175 {
KINU 0:4f081a382f9b 176 for(int j = 0; j < 5; j++) {
KINU 0:4f081a382f9b 177 for(int i = 32; i > 0; i--) {
KINU 0:4f081a382f9b 178 if(register_data_array[j] & (1 << (i - 1))) {
KINU 0:4f081a382f9b 179 pc.printf("1");
KINU 0:4f081a382f9b 180 } else {
KINU 0:4f081a382f9b 181 pc.printf("0");
KINU 0:4f081a382f9b 182 }
KINU 0:4f081a382f9b 183 }
KINU 0:4f081a382f9b 184 printf("\r\n");
KINU 0:4f081a382f9b 185 }
KINU 0:4f081a382f9b 186 }
KINU 1:515864d13410 187 double packet(char c)
KINU 0:4f081a382f9b 188 {
KINU 0:4f081a382f9b 189 static int a = 0;
KINU 1:515864d13410 190 double calsat_freq;
KINU 0:4f081a382f9b 191 _command[a] = c;
KINU 0:4f081a382f9b 192 a++;
KINU 0:4f081a382f9b 193 if(_command[a-1] == 0xfd) {
KINU 1:515864d13410 194 calsat_freq = doppler(_command);
KINU 2:0a0b5c62d10c 195 Reg0_gen(1, calsat_freq, human_freq,_register); //reg0をcalsatの値で更新
KINU 0:4f081a382f9b 196 /*
KINU 0:4f081a382f9b 197 for(int j = 0; j < a; j++)
KINU 0:4f081a382f9b 198 printf("%02hhx",_command[j]);
KINU 0:4f081a382f9b 199 printf("\r\n");
KINU 0:4f081a382f9b 200 */
KINU 0:4f081a382f9b 201 a = 0;
KINU 0:4f081a382f9b 202 }
KINU 1:515864d13410 203 return calsat_freq;
KINU 0:4f081a382f9b 204 }
KINU 1:515864d13410 205 void check(char key,double calsat_freq)
KINU 0:4f081a382f9b 206 {
KINU 2:0a0b5c62d10c 207 printf("key = %c\r\n",key);
KINU 0:4f081a382f9b 208 if(_command[4] == 0x00) {
KINU 0:4f081a382f9b 209 printf("---------------------------Start-----------------------------\r\n");
KINU 1:515864d13410 210 file_read(key,calsat_freq);
KINU 0:4f081a382f9b 211 }
KINU 0:4f081a382f9b 212 }
KINU 0:4f081a382f9b 213 };
KINU 0:4f081a382f9b 214 int main()
KINU 0:4f081a382f9b 215 {
KINU 0:4f081a382f9b 216 Serial device( p9, p10, 9600);
KINU 2:0a0b5c62d10c 217 printf("Start\r\n");
KINU 0:4f081a382f9b 218 while(1) {
KINU 0:4f081a382f9b 219 calsat32 tmp;
KINU 0:4f081a382f9b 220 while(device.readable()) {
KINU 0:4f081a382f9b 221 char c = device.getc();
KINU 1:515864d13410 222 double calsat_freq = tmp.packet(c);
KINU 0:4f081a382f9b 223 if(pc.readable()) {
KINU 0:4f081a382f9b 224 char key = pc.getc();
KINU 1:515864d13410 225 if(key == '1' ||key == '2'){
KINU 1:515864d13410 226 tmp.check(key,calsat_freq);
KINU 1:515864d13410 227 //file読み込み、calsator人の更新
KINU 1:515864d13410 228 }
KINU 1:515864d13410 229 else if(key == '3')//reg0を人にする
KINU 1:515864d13410 230 tmp.check(key,calsat_freq);
KINU 0:4f081a382f9b 231 }
KINU 0:4f081a382f9b 232 }
KINU 0:4f081a382f9b 233 }
KINU 0:4f081a382f9b 234 return 0;
KINU 0:4f081a382f9b 235 }