//2013.10.24 /******************************************************************************* * モジュール名称 :アプリケーション02 - HK read & anaylses - MPPE/MEA * * 参考 : app02_DPU.c を参照 * * 注意 : EDIT権限は、MPPE/MEA組 * * 作成日・作成者 :2011/10/08 Y.K. * *******************************************************************************/ #include "app_common.h" #include "app_MPPE-MEA.h" #include "app_MPPE-MIA.h" #define d_SIZEhk_MEA 128 // HK-size (0x19) int app02_MEA_setTable0(unsigned char); int app02_MEA_setTable1(unsigned char); int app02_MEA_readE2PROM(unsigned char); int app02_hkchck_MEA(unsigned char, unsigned char*); int app02_genSWHK_MEA(unsigned char, unsigned char*); // ******************************************************************** // *** MEA1 : HK analyses, HW CMD production, HK packet production *** // ******************************************************************** int app02_MEA1 ( unsigned char uc_dataHK[], unsigned int ui_counter, unsigned char uc_link ) { unsigned char uc_dpuSwHk[0x100]; int i_dpuSwHK_size = 0; int i; int i_flag; // unsigned char uc_cmdSize = 0; // CMD : size to MEA (1-163) // unsigned char uc_cmdBuffer[163]; // CMD : contents to MEA // ************************* // *** HW HK analyses *** // ************************* if ( uc_link ) { // --- HW-ON --- i_flag = app02_hkchck_MEA(Gd_N_MEA1, uc_dataHK); //CHECK and CMD exe if HK values are out of the limits } else { // --- HW-OFF --- for (i=0; i 0) memcpy( &uc_dataHK[d_SIZEhk_MEA], uc_dpuSwHk, i_dpuSwHK_size ); else i_dpuSwHK_size = 0; // ****************************** // *** HK Production in 'OFF *** // ****************************** if ( uc_link == 0 ) return( 0 ); else return( d_SIZEhk_MEA+i_dpuSwHK_size ); } // ******************************************************************** // *** MEA2 : HK analyses, HW CMD production, HK packet production *** // ******************************************************************** int app02_MEA2 ( unsigned char uc_dataHK[], unsigned int ui_counter, unsigned char uc_link ) { unsigned char uc_dpuSwHk[0x100]; int i_dpuSwHK_size = 0; int i; int i_flag; // ************************* // *** HW HK analyses *** // ************************* if ( uc_link ) { // --- HW-ON --- i_flag = app02_hkchck_MEA(Gd_N_MEA2, uc_dataHK);//MEA2 = 1 //CHECK and CMD exe if HK values are out of the limits } else { // --- HW-OFF --- for (i=0; i 0) memcpy( &uc_dataHK[d_SIZEhk_MEA], uc_dpuSwHk, i_dpuSwHK_size ); else i_dpuSwHK_size = 0; // ****************************** // *** HK Production in 'OFF *** // ****************************** //if ( uc_link == 0 && uc_swEna ==0 ) return( 0 ); if ( uc_link == 0 ) return( 0 ); else return( d_SIZEhk_MEA+i_dpuSwHK_size ); } int app02_genSWHK_MEA(unsigned char uc_sens, unsigned char uc_SwHK[]) { int i; struct _s_MEA_CtrlParam *pCtrl; //制御用のフラグ及びパラメータ struct _s_MEA_Command *pCmd; if (uc_sens == Gd_N_MEA1) { pCtrl = &Gst_MEA1_ctrl; pCmd = &Gst_MEA1_cmd;} else { pCtrl = &Gst_MEA2_ctrl; pCmd = &Gst_MEA2_cmd;} //SOFTWARE HK uc_SwHK[0] = pCmd->uc_cnt;//コマンドカウンタ uc_SwHK[1] = pCmd->uc_err_cnt;//エラーカウンタ for (i = 2; i <= 5; ++i) uc_SwHK[i] = pCmd->uc_ans[i-2];//コマンドアンサ0-3 uc_SwHK[6] = pCtrl->uc_snap_ave | (pCtrl->uc_eng_sci << 1 & 0x02) | (pCtrl->uc_mode << 2 & 0x3c) | (pCtrl->uc_stpe_ena << 6 & 0x40) | (pCtrl->uc_gf_ena << 7 & 0x80); uc_SwHK[7] = pCtrl->us_pot_A >> 4 & 0xff; uc_SwHK[8] = (pCtrl->us_pot_A << 4 & 0xf0) | (pCtrl->us_pot_B >> 8 & 0x0f); uc_SwHK[9] = pCtrl->us_pot_B & 0xff; uc_SwHK[10]= (pCtrl->uc_HKmon_ena & 0x1f) | (pCtrl->uc_en_tbl << 5 & 0x60) | (pCtrl->uc_pot_mode << 7 & 0x80); //1.5B x 2 uc_SwHK[11]= pCtrl->us_TMCP_lmt[0] >> 4 & 0xff; uc_SwHK[12]= (pCtrl->us_TMCP_lmt[0] << 4 & 0xf0) | (pCtrl->us_TMCP_lmt[1] >> 8 & 0x0f); uc_SwHK[13]= pCtrl->us_TMCP_lmt[1] & 0xff; uc_SwHK[14]= pCtrl->us_MCP_lmt[0] >> 4 & 0xff; uc_SwHK[15]= (pCtrl->us_MCP_lmt[0] << 4 & 0xf0) | (pCtrl->us_MCP_lmt[1] >> 8 & 0x0f); uc_SwHK[16]= pCtrl->us_MCP_lmt[1] & 0xff; uc_SwHK[17]= pCtrl->us_IMCP_lmt[0] >> 4 & 0xff; uc_SwHK[18]= (pCtrl->us_IMCP_lmt[0] << 4 & 0xf0) | (pCtrl->us_IMCP_lmt[1] >> 8 & 0x0f); uc_SwHK[19]= pCtrl->us_IMCP_lmt[1] & 0xff; uc_SwHK[20]= pCtrl->us_TFPG_lmt[0] >> 4 & 0xff; uc_SwHK[21]= (pCtrl->us_TFPG_lmt[0] << 4 & 0xf0) | (pCtrl->us_TFPG_lmt[1] >> 8 & 0x0f); uc_SwHK[22]= pCtrl->us_TFPG_lmt[1] & 0xff; uc_SwHK[23]= pCtrl->us_IP5V_lmt[0] >> 4 & 0xff; uc_SwHK[24]= (pCtrl->us_IP5V_lmt[0] << 4 & 0xf0) | (pCtrl->us_IP5V_lmt[1] >> 8 & 0x0f); uc_SwHK[25]= (pCtrl->us_IP5V_lmt[1] & 0xff); //VM for (i = 26; i <= 34; ++i) uc_SwHK[i]= pCtrl->uc_ep[i-26]; memcpy(&uc_SwHK[35], &pCtrl->ui_eng_vmf, 4); uc_SwHK[39] = pCtrl->uc_gf_spn; uc_SwHK[40] = pCtrl->uc_HK_anmly; uc_SwHK[41] = pCtrl->uc_MCP_V[0]; uc_SwHK[42] = pCtrl->uc_MCP_V[1]; uc_SwHK[43] = (pCtrl->uc_got_e2p_prm & 0x01) |(pCtrl->uc_swcal_prm[0] << 1 & 0x02) |(pCtrl->uc_vet_cmp_ena << 2 & 0x04) |(pCtrl->uc_B_sec << 3 & 0x38) |(pCtrl->uc_B_mode << 6 & 0x40); uc_SwHK[44] = d_Lcl_MIA_TLMID0; if (uc_sens == Gd_N_MEA1) uc_SwHK[45] = d_Lcl_MEA1_TLMID1; else if (uc_sens == Gd_N_MEA2) uc_SwHK[45] = d_Lcl_MEA2_TLMID1; return (46); //Size of Software HK } int app02_hkchck_MEA(unsigned char uc_sens, unsigned char uc_dataHK[]) { int i_flg; unsigned short us_hk_val; unsigned char uc_UsrReq; unsigned char uc_MCPoff[2], uc_MCPon[2], uc_Gfctr[2], uc_StpEn[2], uc_ModeROM3[2]; struct _s_MEA_Command *pCmd; struct _s_MEA_CtrlParam *pCtrl, *pCtrl1; //制御用のフラグ及びパラメータ i_flg = 0; if (uc_sens == Gd_N_MEA1) { pCtrl = &Gst_MEA1_ctrl; pCmd = &Gst_MEA1_cmd; uc_UsrReq = 8;} else { pCtrl = &Gst_MEA2_ctrl; pCmd = &Gst_MEA2_cmd; uc_UsrReq = 9;} pCtrl1 = &Gst_MEA1_ctrl; // // コマンド対応 // //Setting of CMD -> SENSOR uc_MCPoff[0] = 0x19; uc_MCPoff[1] = 0; uc_MCPon[0] = 0x1c; uc_MCPon[1] = 0; uc_Gfctr[0] = 0x08; uc_Gfctr[1] = 0; uc_StpEn[0] = 0x11; uc_StpEn[1] = 32; uc_ModeROM3[0] = 0x02; uc_ModeROM3[1] = 0x01; // # Set Lookup TABLE if (pCtrl->uc_settbl_n == 1) { i_flg = app02_MEA_setTable0(uc_sens); pCtrl->uc_settbl_n = 2; } else if (pCtrl->uc_settbl_n == 2) { i_flg = app02_MEA_setTable1(uc_sens); pCtrl->uc_settbl_n = 0; } // # read E2PROM if (pCtrl->uc_readrom) { i_flg = app02_MEA_readE2PROM(uc_sens); pCtrl->uc_readrom = FALSE; pCtrl->uc_settbl_n = 0x10; } else if (pCtrl->uc_settbl_n == 0x10) { i_flg = app02_MEA_setTable1(uc_sens); pCtrl->uc_settbl_n = 0; pCtrl->uc_got_e2p_prm = TRUE; } // # Automatic g-factor control if (pCtrl->uc_gf_ena) { //Decreasing g-factor // if (pCtrl->uc_gf_no == 5) { //MEA2 with T3 uc_Gfctr[1] = 1; //GF1 i_flg = app_PiCmd(uc_sens, uc_Gfctr, 2); //CMD if (!i_flg) { pCtrl->uc_gf_spn_dec = 0; //CMD正常受付時にフラグを倒す pCtrl->uc_gf_no = 6; //MEA2 with T3 and GF1 } } else if (pCtrl->uc_gf_spn_dec >= pCtrl->uc_gf_spn) { if (pCtrl->uc_gf_no <= 3) { //pCtrl->uc_gf_no coming from app03 //except pCtrl->uc_gf_no >= 5 (MEA2 with T3) uc_Gfctr[1] = pCtrl->uc_gf_no + 1; i_flg = app_PiCmd(uc_sens, uc_Gfctr, 2); //CMD if (!i_flg) pCtrl->uc_gf_spn_dec = 0; //CMD正常受付時にフラグを倒す } else if (uc_sens == Gd_N_MEA2 && pCtrl->uc_gf_no == 4) { //MEA2 of GF4 saturates! uc_ModeROM3[1] = 3; //T3 3keV-25keV i_flg = app_PiCmd(uc_sens, uc_ModeROM3, 2); //CMD set T3 of energy table if (!i_flg) { pCtrl->uc_gf_no = 5; //MEA2 with T3 pCtrl->uc_en_tbl = 3; } } } //Increasing f-factor // if (pCtrl->uc_gf_no == 7) { uc_ModeROM3[1] = 1; //T1 3eV-25keV i_flg = app_PiCmd(uc_sens, uc_ModeROM3, 2); //CMD set T1 of energy table if (!i_flg) { pCtrl->uc_gf_no = 4; pCtrl->uc_en_tbl = 1; pCtrl->uc_gf_spn_inc = 0; //CMD正常受付時にフラグを倒す } } if (pCtrl->uc_gf_spn_inc >= pCtrl->uc_gf_spn) { if (pCtrl->uc_gf_no >= 2 && pCtrl->uc_gf_no <= 4) { //pCtrl->uc_gf_no coming from app03 !! down to 1 not 0 !! //except pCtrl->uc_gf_no >= 5 (MEA2 with T3) uc_Gfctr[1] = pCtrl->uc_gf_no - 1; i_flg = app_PiCmd(uc_sens, uc_Gfctr, 2); //CMD if (!i_flg) pCtrl->uc_gf_spn_inc = 0; //CMD正常受付時にフラグを倒す } } if (pCtrl->uc_gf_no == 6 && pCtrl1->uc_gf_no <= 2) {//MEA2 with T3 and GF1 and MEA1 under GF2 uc_Gfctr[1] = 4; //GF4 i_flg = app_PiCmd(uc_sens, uc_Gfctr, 2); //CMD if (!i_flg) { pCtrl->uc_gf_no = 7; } } } // # Automatic sending STOP ENERGY MODE ON if (pCtrl->uc_stpe_ena) { if (pCmd->uc_cnt_en++%16 == 1) { //1/4spins uc_StpEn[1] = pCtrl->uc_stpe_no; //1-32 i_flg = app_PiCmd(uc_sens, uc_StpEn, 2); //CMD } } //In case of HK monitor ENA, MCP OFF will be done when HK is out of limits //HK_TMP_MCP if (pCtrl->uc_HKmon_ena & 0x01) { us_hk_val = ((unsigned short)uc_dataHK[6] << 4 & 0xff0) + (uc_dataHK[7] >> 4 & 0x0f);//from 48-60bit if (us_hk_val > pCtrl->us_TMCP_lmt[1] || us_hk_val < pCtrl->us_TMCP_lmt[0]) { pCmd->uc_mcp_off++; pCtrl->uc_HK_anmly |= 0x01; //HK } } //HK_MCP if (pCtrl->uc_HKmon_ena >> 1 & 0x01) { us_hk_val = ((unsigned short)uc_dataHK[3] << 4 & 0xff0) + (uc_dataHK[4] >> 4 & 0x0f);//from 24-36bit if (us_hk_val > pCtrl->us_MCP_lmt[1] || us_hk_val < pCtrl->us_MCP_lmt[0]) { pCmd->uc_mcp_off++; pCtrl->uc_HK_anmly |= 0x02; //HK } } //I_MCP if (pCtrl->uc_HKmon_ena >> 2 & 0x01) { us_hk_val = ((unsigned short)uc_dataHK[10] << 8 & 0xf00) + uc_dataHK[11]; //from 84-96bit if (us_hk_val > pCtrl->us_IMCP_lmt[1] || us_hk_val < pCtrl->us_IMCP_lmt[0]) { pCmd->uc_mcp_off++; pCtrl->uc_HK_anmly |= 0x04; //HK } } //In case of HK monitor ENA, MCP OFF & PSU OFF will be done when HK is out of limits //HK_TMP_FPG if (pCtrl->uc_HKmon_ena >> 3 & 0x01) { us_hk_val = ((unsigned short)uc_dataHK[4] << 8 & 0xf00) + uc_dataHK[5]; //from 36-48bit if (us_hk_val > pCtrl->us_TFPG_lmt[1] || us_hk_val < pCtrl->us_TFPG_lmt[0]) { pCmd->uc_mcp_off++; pCmd->uc_psu_off++; pCtrl->uc_HK_anmly |= 0x08; //HK } } //HK_I_P5V if (pCtrl->uc_HKmon_ena >> 4 & 0x01) { us_hk_val = ((unsigned short)uc_dataHK[7] << 8 & 0xf00) + uc_dataHK[8]; //from 60-72bit if (us_hk_val > pCtrl->us_IP5V_lmt[1] || us_hk_val < pCtrl->us_IP5V_lmt[0]) { pCmd->uc_mcp_off++; pCmd->uc_psu_off++; pCtrl->uc_HK_anmly |= 0x10; //HK } } //Turning off MCP if (pCmd->uc_mcp_off == 1) { uc_MCPon[1] = pCtrl->uc_MCP_V[0]; i_flg = app_PiCmd(uc_sens, uc_MCPon, 2); } else if (pCmd->uc_mcp_off == 5) { uc_MCPon[1] = pCtrl->uc_MCP_V[1]; i_flg = app_PiCmd(uc_sens, uc_MCPon, 2); } else if (pCmd->uc_mcp_off == 9) { uc_MCPon[1] = 0; i_flg = app_PiCmd(uc_sens, uc_MCPon, 2); } else if (pCmd->uc_mcp_off > 12) { i_flg = app_PiCmd(uc_sens, uc_MCPoff, 2); if (!i_flg) { pCtrl->uc_HKmon_ena &= 0xf8; //CMD正常受付時にフラグを倒す pCmd->uc_mcp_off = 0; } } //MEA PSU OFF if (pCmd->uc_psu_off > 24) { i_flg = app_DmcRequestCmd(uc_UsrReq); if (!i_flg) { pCmd->uc_psu_off = 0; pCtrl->uc_HK_anmly |= 0x20; //HK pCtrl->uc_HKmon_ena &= 0xe0; //CMD正常受付時にフラグを倒す } } if (i_flg) pCmd->uc_err_cnt++; //APP02ではエラーカウンタはここで数える return i_flg; } // // int app02_MEA_readE2PROM(unsigned char uc_sens) { int i_flag; struct _s_MEA_CtrlParam *pCtrl; //制御用のフラグ及びパラメータ struct _s_MEA_ProcParam *pP; //解析用パラメータ E2PROMからデータを読み込む unsigned int ui_RomAdr; unsigned char uc_val[16]; //double f_sctr; if (uc_sens == Gd_N_MEA1) { pCtrl = &Gst_MEA1_ctrl; pP = &Gst_MEA1_proc; ui_RomAdr = Gd_MEA_RomAdr; } else { pCtrl = &Gst_MEA2_ctrl; pP = &Gst_MEA2_proc; ui_RomAdr = Gd_MEA_RomAdr + d_Lcl_MEA_E2P_SIZE; } i_flag = 0; //HKモニタの制限値の読み込み i_flag += app_readROM(ui_RomAdr, 16, uc_val); pCtrl->us_TMCP_lmt[0] = ((unsigned short)uc_val[ 0] << 4 & 0xff0) + (uc_val[ 1] >> 4 & 0x0f); pCtrl->us_TMCP_lmt[1] = ((unsigned short)uc_val[ 1] << 8 & 0xf00) + uc_val[ 2]; pCtrl->us_MCP_lmt[0] = ((unsigned short)uc_val[ 3] << 4 & 0xff0) + (uc_val[ 4] >> 4 & 0x0f); pCtrl->us_MCP_lmt[1] = ((unsigned short)uc_val[ 4] << 8 & 0xf00) + uc_val[ 5]; pCtrl->us_IMCP_lmt[0] = ((unsigned short)uc_val[ 6] << 4 & 0xff0) + (uc_val[ 7] >> 4 & 0x0f); pCtrl->us_IMCP_lmt[1] = ((unsigned short)uc_val[ 7] << 8 & 0xf00) + uc_val[ 8]; pCtrl->us_TFPG_lmt[0] = ((unsigned short)uc_val[ 9] << 4 & 0xff0) + (uc_val[10] >> 4 & 0x0f); pCtrl->us_TFPG_lmt[1] = ((unsigned short)uc_val[10] << 8 & 0xf00) + uc_val[11]; pCtrl->us_IP5V_lmt[0] = ((unsigned short)uc_val[12] << 4 & 0xff0) + (uc_val[13] >> 4 & 0x0f); pCtrl->us_IP5V_lmt[1] = ((unsigned short)uc_val[13] << 8 & 0xf00) + uc_val[14]; //VM計算用のパラメータ読み込み ui_RomAdr += 16; i_flag += app_readROM(ui_RomAdr, 80, (unsigned char*)pP->uc_gf); //5x16 x1B ui_RomAdr += 80; i_flag += app_readROM(ui_RomAdr, 80, (unsigned char*)pP->uc_gf2); ui_RomAdr += 80; i_flag += app_readROM(ui_RomAdr, 80, (unsigned char*)pP->c_csp); ui_RomAdr += 80; i_flag += app_readROM(ui_RomAdr, 80, (unsigned char*)pP->c_csa); ui_RomAdr += 80; i_flag += app_readROM(ui_RomAdr, 192, (unsigned char*)pP->us_v32); //64 + 32*3 x2B ui_RomAdr += 192; i_flag += app_readROM(ui_RomAdr, 80, (unsigned char*)pP->uc_vf); //5x16 x1B return (i_flag); } int app02_MEA_setTable0(unsigned char uc_sens) { int i; struct _s_MEA_ProcParam *pP; if (uc_sens == Gd_N_MEA1) pP = &Gst_MEA1_proc; else pP = &Gst_MEA2_proc; //gf for Et, gf2 for VM Ch間の違いのみを表す。 for (i = 0; i < 5*16; ++i) { //基準値 + 1-0xff //0 の場合は0 (vfを除く) pP->uc_gf[i] = 0x7f; pP->uc_gf2[i] = 0x7f; pP->uc_vf[i] = 0x7f; //中心値からのずれ(+-11.25 deg.)を表す pP->c_csp[i] = 0x7f; //0; pP->c_csa[i] = 0x7f; //0; } pP->us_v32[0] = 60064; for (i = 1; i < 32; ++i) pP->us_v32[i] = pP->us_v32[i-1]*0.8644; pP->us_v32[32] = 20724; for (i = 33; i < 64; ++i) pP->us_v32[i] = pP->us_v32[i-1]*0.8946; pP->us_v32[64] = 60064; for (i = 65; i < 96; ++i) pP->us_v32[i] = pP->us_v32[i-1]*0.9600; return 0; } int app02_MEA_setTable1(unsigned char uc_sens) { int i, j, k; struct _s_MEA_ProcParam *pP; double f_az0, f_pl, f_az, f_pl1, f_az1; short s_cosx, s_sinx; if (uc_sens == Gd_N_MEA1) { pP = &Gst_MEA1_proc; f_az0 = d_Lcl_MEA1_PHI0; } else { pP = &Gst_MEA2_proc; f_az0 = d_Lcl_MEA2_PHI0; } //Polar for (i = 0; i < 16; ++i) { f_pl = (-78.75 + i*22.5)*MATH_PI/180.; //Centor of Polar angle pP->s_csp0[i] = (short)(app_math_cos(f_pl)*d_Lcl_MEA_TBL_RD1); pP->s_snp0[i] = (short)(app_math_sin(f_pl)*d_Lcl_MEA_TBL_RD1); for (k = 0; k < 5; ++k) { f_pl1 = f_pl + d_Lcl_MEA_MAX_RAD*pP->c_csp[i + 16*k]/d_Lcl_MEA_TBL_RAD; //Real Polar angle s_cosx = (short)(app_math_cos(f_pl1)*d_Lcl_MEA_TBL_RD1); s_sinx = (short)(app_math_sin(f_pl1)*d_Lcl_MEA_TBL_RD1); pP->c_csp[i + 16*k] = (char)(s_cosx - pP->s_csp0[i]); pP->c_snp[i + 16*k] = (char)(s_sinx - pP->s_snp0[i]); } } //Azimuth //再配置 for (k = 1; k < 5; ++k) memcpy(&pP->c_csa[256*k], &pP->c_csa[16*k], 16); //セクター方向に展開 for (j = 15; j >= 0; --j) { f_az = f_az0 + MATH_PI/8*j; //Centor of Azimuth pP->s_csa0[j] = (short)(app_math_cos(f_az)*d_Lcl_MEA_TBL_RD1); pP->s_sna0[j] = (short)(app_math_sin(f_az)*d_Lcl_MEA_TBL_RD1); for (i = 0; i < 16; ++i) { for (k = 0; k < 5; ++k) { f_az1 = f_az + d_Lcl_MEA_MAX_RAD*pP->c_csa[i+k*256]/d_Lcl_MEA_TBL_RAD; //Real azimuth s_cosx = (short)(app_math_cos(f_az1)*d_Lcl_MEA_TBL_RD1); s_sinx = (short)(app_math_sin(f_az1)*d_Lcl_MEA_TBL_RD1); //if (i >= 8) f_az1 += MATH_PI; //plrが一周させるのでここで考慮する必要はない。 pP->c_sna[i+16*j+k*256] = (char)(s_sinx - pP->s_sna0[j]); pP->c_csa[i+16*j+k*256] = (char)(s_cosx - pP->s_csa0[j]); } } } return 0; }