#include #include #include #include //mk_mia_rom.c から抜粋する #define MIN_GF_SW16 1.5e-7 #define MIN_GF_AL08 4.0e-6 #define MIN_GF_AL16 1.0e-4 #define MAX_ENEGY_TABLE 30000. //(eV) char conv_VM(double*, double*, unsigned int, int); char USHORTtoDBL(double*, unsigned short*, unsigned int); int main(int argc, char *argv[]) { int i; long ltmp; unsigned short us_val[10]; double d_val[10]; double d_val_phys[10]; if (argc != 11) { printf("Usage: ./***.exe 10 VM values (ex. 1111 2222 ... aaaa(hex))\n"); exit(1); } for (i = 0; i < 10; ++i) us_val[i] = (unsigned short) strtol(argv[i], NULL, 16); USHORTtoDBL(d_val, us_val, 10); conv_VM(d_val_phys, d_val, 10, 0); //VM計算がなされた観測モードの設定が必要 for (i = 0; i < 10; ++i) printf("%.2e ", d_val_phys[i]); printf("\n"); } char conv_VM( double f_VMout[], //[OUTPUT] double f_VMin[], //[INPUT] f_VM[10] unsigned int len, //[INPUT] 10 values for MIA int i_mode) //[INPUT] 0:M1-SW-spOff, 1:M1-SW-spOn, 2:M1-All-spOff, 3:M1-All-spOn // 4:M2, 5:M3 { double egf = 1.; //eff*gf規格化パラメータ double dEoverE = 1.; //deltaE/E [[ 要入力 ]] double EngtoVlc = 1.; //sqrt(Energy)->velocity変換係数 double sq_MX_E = 1.; //sqrt(Energy)規格化パラメータ double dtheta = 1.; //delta theta S/C座標系 [[ 要入力 ]] double dazmth = 1.; //delta azimth S/C座標系 [[ 要入力 ]] double Time = 0.01; //Sampling time [[ 要入力 ]] EngtoVlc = sqrt(2*1.60218e-19/1.67262e-27)*100; //(eV) -> (cm/s) switch (i_mode) { case 0: egf = MIN_GF_SW16; dEoverE = 0.1; sq_MX_E = sqrt(MAX_ENEGY_TABLE); dtheta = 90./16/180*M_PI; dazmth = 90./16/180*M_PI; Time = 0.0020; break; case 1: egf = MIN_GF_SW16; dEoverE = 0.1; sq_MX_E = sqrt(MAX_ENEGY_TABLE); dtheta = 90./16/180*M_PI; dazmth = 90./16/180*M_PI; Time = 0.0020; break; case 2: egf = MIN_GF_AL08; dEoverE = 0.1; sq_MX_E = sqrt(MAX_ENEGY_TABLE); dtheta = 180./8/180*M_PI; dazmth = 180./8/180*M_PI; Time = 0.0078; break; case 3: egf = MIN_GF_AL08; dEoverE = 0.1; sq_MX_E = sqrt(MAX_ENEGY_TABLE); dtheta = 180./8/180*M_PI; dazmth = 180./8/180*M_PI; Time = 0.0078; break; case 4: egf = MIN_GF_AL16; dEoverE = 0.1; sq_MX_E = sqrt(MAX_ENEGY_TABLE); dtheta = 180./16/180*M_PI; dazmth = 180./16/180*M_PI; Time = 0.0039; break; case 5: egf = MIN_GF_AL08; dEoverE = 0.1; sq_MX_E = sqrt(MAX_ENEGY_TABLE); dtheta = 180./8/180*M_PI; dazmth = 180./8/180*M_PI; Time = 0.0078; break; default: break; } f_VMout[0] = f_VMin[0]/sq_MX_E/egf*dEoverE*dtheta*dazmth/Time/EngtoVlc*0xffff; f_VMout[1] = f_VMin[1] /egf*dEoverE*dtheta*dazmth/Time *0xffff; f_VMout[2] = f_VMin[2] /egf*dEoverE*dtheta*dazmth/Time *0xffff; f_VMout[3] = f_VMin[3] /egf*dEoverE*dtheta*dazmth/Time *0xffff; f_VMout[4] = f_VMin[4]*sq_MX_E/egf*dEoverE*dtheta*dazmth/Time*EngtoVlc*0xffff; f_VMout[5] = f_VMin[5]*sq_MX_E/egf*dEoverE*dtheta*dazmth/Time*EngtoVlc*0xffff; f_VMout[6] = f_VMin[6]*sq_MX_E/egf*dEoverE*dtheta*dazmth/Time*EngtoVlc*0xffff; f_VMout[7] = f_VMin[7]*sq_MX_E/egf*dEoverE*dtheta*dazmth/Time*EngtoVlc*0xffff; f_VMout[8] = f_VMin[8]*sq_MX_E/egf*dEoverE*dtheta*dazmth/Time*EngtoVlc*0xffff; f_VMout[9] = f_VMin[9]*sq_MX_E/egf*dEoverE*dtheta*dazmth/Time*EngtoVlc*0xffff; } //For WINDOWS LITTLE ENDIAN !!while the MDP com. shall be by the big-endian // assuing: // double 64bit // USHORT 16bit char USHORTtoDBL(double *pf_outbuf, // [OUTPUT] unsigned short *pus_inbuf, // [INPUT] us_VM[10] in Little endian unsigned int len) // [INPUT] 10 values for MIA { int i; //共用体 union { double d;//1(sign) + 11(exponent) + 52(fraction) unsigned char uc[8]; } un_dat; for(i = 0; i < len; i++){ //1(sign) + 5(exponent) + 10(fraction) --> // 1(sign) + 11(exponent) + 52(fraction) //1 + 11 + 52 if (*pus_inbuf == 0x7c00) { //+無限大 un_dat.uc[7] = 0x7f; un_dat.uc[6] = 0xf0; un_dat.uc[5] = 0; un_dat.uc[4] = 0; un_dat.uc[3] = 0; un_dat.uc[2] = 0; un_dat.uc[1] = 0; un_dat.uc[0] = 0; } else if (*pus_inbuf == 0xfc00) { //-無限大 un_dat.uc[7] = 0xff; un_dat.uc[6] = 0xf0; un_dat.uc[5] = 0; un_dat.uc[4] = 0; un_dat.uc[3] = 0; un_dat.uc[2] = 0; un_dat.uc[1] = 0; un_dat.uc[0] = 0; } else if (*pus_inbuf == 0) { //0 un_dat.d = 0; } else { //exp != 0 正規化 if ((*pus_inbuf >> 14) & 0x01) un_dat.uc[7] = (*pus_inbuf >> 8 & 0xc0); //exp > 0x0f else un_dat.uc[7] = (*pus_inbuf >> 8 & 0xc0) | 0x3f;//exp <= 0x0f un_dat.uc[6] = (((*pus_inbuf >> 8 & 0x3f) << 2) | (((*pus_inbuf & 0xff) >> 6) & 0x03) ); un_dat.uc[5] = (((*pus_inbuf & 0xff) & 0x3f) << 2); un_dat.uc[4] = 0; un_dat.uc[3] = 0; un_dat.uc[2] = 0; un_dat.uc[1] = 0; un_dat.uc[0] = 0; } *pf_outbuf++ = un_dat.d; pus_inbuf++; } return 1; }