//2018.05.10 /******************************************************************************* * モジュール名称 :APP03 Mission TLM (L&M) PI tasks * * モジュールラベル :app03_PIs * * タスク区分 :Application-03 MEA task for Mission TLM (L&M) * * 機能 : * * コーリングシーケンス:void app03_(PI) * * 引数 :なし * * 戻り値 :なし * * 使用上の注意 :グローバル変数はアプリケーション01でまとめて初期化 * * エラー処理 :なし * * 注意 : EDIT権限は、MPPE/MEA組 * * 作成日・作成者 :2018/5/18 rev by Y.K. * *******************************************************************************/ #include "app_common.h" #include "app_MPPE-MIA.h" #include "app_MPPE-MEA.h" #include "app_comp_rice.h" // *** Macro - Local *** //void app03_TlmDump ( unsigned char, unsigned char, unsigned char ); int app03_MEA_proc( unsigned char, unsigned int); int app03_MEA_makeL( unsigned char, unsigned int, unsigned short*, unsigned short*); int app03_MEA_makeM( unsigned char, unsigned int, unsigned short*, unsigned short*, unsigned short*); int app03_MEA_makeL64( unsigned char, unsigned int, unsigned short*, unsigned short*); int app03_MEA_makeM64( unsigned char, unsigned int, unsigned short*, unsigned short*); int app03_MEA_calVM(unsigned char, unsigned int, unsigned short*, int, int, unsigned char*, double*); int app03_MEA_put3D(unsigned short*, unsigned short*); int app03_MEA_getSCfromMGF(unsigned char, unsigned char, unsigned int); void app03_MEA1( unsigned int ui_sunpulseCnt ) { app03_MEA_proc(Gd_N_MEA1, ui_sunpulseCnt); return; } void app03_MEA2( unsigned int ui_sunpulseCnt ) { app03_MEA_proc(Gd_N_MEA2, ui_sunpulseCnt); return; } int app03_MEA_proc(unsigned char uc_nodeId, unsigned int ui_sunpulseCnt) //SENSOR ID 0: MEA1 1:MEA2 { //unsigned char *puc_dat; int i, j; int i_flag, i_rmap_hdr; // // === BLOCK read === int i_bufId, i_bufId2; // Buffer ID *** int i_numNewBlock, i_numNewBlock2; // Num of blocks with new data *** unsigned int ui_timeData; // Processing data TI *** M_T_BLOCK_INFO t_blockInfo; // unsigned int ui_createTime Block 生成開始時衛星時刻(1LSB=1,953ms) //DEBUG #ifdef _GET_WORKING_TIME_MEA__03 M_T_TIME_INFO t_timeInfo; unsigned int ui_tmp1, ui_tmp2, ui_tmp3; i_flag = dpu_getTime( &t_timeInfo); ui_tmp1 = t_timeInfo.ui_currentTime2; #endif // // Packet handle unsigned char uc_pckt; //パケット番号 unsigned char uc_en_mode; //エネルギーモード: 2(32en x 16sc), 4(64en x 16sc)のみに対応 unsigned char uc_find_pac1; //パケット番号1の検出フラグ unsigned char uc_pacEndNo; //最終パケット番号 unsigned short *us_Lbuf; //16-spin Lproduct buffer 2kB unsigned char uc_se_mode; struct _s_MEA_CtrlParam *pCtrl; //制御用のフラグ及びパラメータ MEA1or2 if (uc_nodeId == Gd_N_MEA1) pCtrl = &Gst_MEA1_ctrl; else pCtrl = &Gst_MEA2_ctrl; i_rmap_hdr = 12; //RMAPヘッダ:12B uc_find_pac1 = FALSE; //パケット番号1の検出フラグ uc_pckt = 0; uc_en_mode = 0; //COMMENT2 uc_se_mode = pCtrl->uc_snap_ave + pCtrl->uc_eng_sci*2 + (pCtrl->uc_mode << 2 & 0x3c); us_Lbuf = pCtrl->us_Ldata; //BUFFER for L products // ----------------------------------------------------------- // -- Set at the buffer with the oldest non-processed block -- // ----------------------------------------------------------- i_bufId = app_CheckNonProcBlock ( uc_nodeId, 0, // [INPUT] Node/Data ID Gui_TLMm_blockTime[uc_nodeId], // [INPUT] TI of Processed Block & ui_timeData); // [OUTPUT] TI of Newest Block in the selected buffer *** // (return) Buffer-ID (0:L, 1:S, -1:no data) *** if ( i_bufId < 0 ) return FALSE; // === No data === // ------------------------------------------- // -- Set at the oldest non-processed block -- // ------------------------------------------- // Newest Block i_numNewBlock = app_SetNonProcBlock(uc_nodeId, 0, // [INPUT] Node/Data ID i_bufId, // [INPUT] Buffer ID Gui_TLMm_blockTime[uc_nodeId], // [INPUT] TI of Processed Block &t_blockInfo); // [OUTPUT] Block Info *** // (return) >0:Num of blocks, <=0:No data (error) *** if ( i_numNewBlock < 1 ) { Gui_TLMm_blockTime[uc_nodeId] = ui_timeData; // === shift to newest data for SKIP === return FALSE; } if ( i_numNewBlock > 5) i_numNewBlock = 5; // --------------------- // -- Read Block data -- // --------------------- for (i=0; i Gui_TLMm_blockTime[uc_nodeId] && // NEW data t_blockInfo.i_replyNum > 0 && // Data available t_blockInfo.c_invalidFlg == 0 ) { // Data correct //1ブロックは18パケット //パケット毎に読み込み for (j = 0; j < 18; ++j) { //先にヘッダのみ読み込み、ダミーパケットの場合はスキップ i_flag = app_GetPacket( 3, // [INPUT] App-No:3 uc_nodeId, 0, // [INPUT] NodeID = Gd_N_MIA, Data ID = 0 i_bufId, // [INPUT] Buffer ID &t_blockInfo, // [INPUT] Block Info j, // [INPUT] Packet No (先頭:0) 0, // [INPUT] OFFSET読出開始番地(8の倍数) 32, // [INPUT] 読出データ数: G03uc_packet ); // [OUTPUT] 1 Block Data - copied if ( i_flag ) continue; uc_pckt = G03uc_packet[i_rmap_hdr + 5]; if (uc_pckt == 0xff || uc_pckt == 0) continue; uc_pckt &= 0x3f; //パケット番号 // 1-16 M2 // 1-32 M4 if (uc_pckt > 0x20) continue; uc_en_mode = G03uc_packet[i_rmap_hdr + 4]; //M0-4 (2,4のみ) if (uc_en_mode == 4) uc_pacEndNo = 32; //M4 64en x 16sc else uc_pacEndNo = 16; //M2 32en x 16sc and others i_flag = app_GetPacket( 3, // [INPUT] App-No:3 uc_nodeId, 0, // [INPUT] NodeID = Gd_N_MIA, Data ID = 0 i_bufId, // [INPUT] Buffer ID &t_blockInfo, // [INPUT] Block Info j, // [INPUT] Packet No (先頭:0) 0, // [INPUT] OFFSET読出開始番地(8の倍数) d_Lcl_MEA_PACSZ, // [INPUT] 読出データ数: //G03uc_packet ); // [OUTPUT] 1 Block Data - copied G03uc_data + (uc_pckt-1)*d_Lcl_MEA_PACSZ);// [OUTPUT] 1 Block Data - copied directly goes to COUNTER mem. if ( i_flag ) continue; // // Debug用、各パケットの先頭32Bだけ抜粋 // //memcpy(G03uc_data + 32*j, G03uc_packet + 12, 32); //if (j == 17) { // app03_MEA_tlmout(uc_nodeId, //[INPUT] SensorID // (unsigned short*)G03uc_data, // [INPUT]プロダクト // (unsigned short*)G03uc_packet, // [MID] 圧縮後のバッファ // 0); //} //continue; //頭出し if (uc_pckt == 1) { memcpy( Gst_MEA_dat.uc_hdr, G03uc_packet + i_rmap_hdr, 8); //SWEEP#1のヘッダを取得する memcpy(&Gst_MEA_dat.ui_TIL, G03uc_packet + i_rmap_hdr, 4); //TI //EMUのTIを上書き #ifdef _RUN_WITH_EMU_MEA__ Gst_MEA_dat.ui_TIL = t_blockInfo.ui_createTime; #endif uc_find_pac1 = TRUE; //パケット#1検出フラグ } //頭出し以後<< app_GetPacketで直接カウンタ用メモリに配置するのでこの箇所は不要 //ScienceDataをus_dataに再配置する //if (uc_find_pac1 && uc_pckt >= 1 && uc_pckt <= 32) { // memcpy( &G03uc_data[(uc_pckt-1)*d_Lcl_MEA_SCISZ], // &G03uc_packet[i_rmap_hdr + 8], d_Lcl_MEA_SCISZ); //} //最終パケット検出とプロダクト作成、TLM送信 if (uc_find_pac1 && uc_pckt == uc_pacEndNo) { //memcpy(&Gst_MEA_dat.ui_TIL, G03uc_packet + i_rmap_hdr, 4);//SWEEP#1のTIのまま //2018.05.10改訂 memcpy( Gst_MEA_dat.uc_hdr, G03uc_packet + i_rmap_hdr, 8); //SWEEP#16のヘッダで上書き //2018.05.10改訂 uc_find_pac1 = FALSE; //パケット#1検出フラグを戻す if (pCtrl->uc_swcal_prm[0]) { //SW cal ON時: テスト用パルスでカウントデータを上書きする app03_MEA_makeSWcal(uc_nodeId, //[INPUT] SensorID (unsigned short*)G03uc_data, //[OUTPUT] Buffer for Count data uc_en_mode); //[INPUT] モード番号 } //スピンカウンタの管理 同期を取る if (pCtrl->us_spinNo == 0xffff) pCtrl->us_spinNo = 0; else pCtrl->us_spinNo++; //3D-LL 3D-M to be set at app03_MEA_makeM Gst_MEA_dat.us_Mlen2 = 0; Gst_MEA_dat.us_Llen2 = 0; if (uc_en_mode == 4) { //###### NumMode4 64en x 16sc ########## //プロダクト作成 app03_MEA_makeM64( uc_nodeId, //[INPUT] SensorID ui_sunpulseCnt, //[INPUT] Sunpulse (unsigned short*)G03uc_data, //[INPUT] Counter DATA (unsigned short*)G03uc_packet); //[OUTPUT]Product app03_MEA_makeL64( uc_nodeId, //[INPUT] SensorID ui_sunpulseCnt, //[INPUT] Sunpulse (unsigned short*)G03uc_data, //[INPUT] Counter DATA us_Lbuf); //[OUTPUT]Product } else if (uc_en_mode == 2) { //###### NumMode2 32en x 16sc ########## //プロダクト作成 app03_MEA_makeM(uc_nodeId, ui_sunpulseCnt, //[INPUT] SensorID, Sunpulse (unsigned short*)G03uc_data, //[INPUT] Counter DATA (unsigned short*)G03uc_packet, //[OUTPUT]Product Gst_MEA_dat.us_3DM); //[OUTPUT]Product(3D-M) app03_MEA_makeL(uc_nodeId, //[INPUT] SensorID ui_sunpulseCnt, //[INPUT] Sunpulse (unsigned short*)G03uc_data, //[INPUT] Counter DATA us_Lbuf); //[OUTPUT]Product } else { //###### Other modes ########## Gst_MEA_dat.uc_infoL = 7; Gst_MEA_dat.uc_infoM = 7; Gst_MEA_dat.us_Mlen = d_Lcl_MEA_HK2B + 16*32; memcpy(G03uc_packet, G03uc_data + i_rmap_hdr, 16*32*2 + 8); *(us_Lbuf + pCtrl->us_Llen_ttl) = uc_se_mode*0x100 + 7; //MPPE mode + MDPinfo *(us_Lbuf + pCtrl->us_Llen_ttl + 1) = (d_Lcl_MEA_HK2B + 18)*2; //Data length memcpy(us_Lbuf + pCtrl->us_Llen_ttl + 2, G03uc_data + i_rmap_hdr, 16*2 + 8); pCtrl->us_Llen_ttl += d_Lcl_MEA_HK2B + 18; } //TLMの作成 app03_MIA_tlmout(uc_nodeId, //[INPUT] SensorID pCtrl->uc_vet_cmp_ena, //[INPUT] 圧縮フラグ Gst_MEA_dat.us_Mlen, //[INPUT] data長さ uc_se_mode + 0x40, //[INPUT] Comment2 Gst_MEA_dat.uc_infoM, //[INPUT] Comment3 (unsigned short*)G03uc_packet, //[INPUT] Product (unsigned short*)G03uc_data, //[MID] COMPRESSED BUF Gst_MEA_dat.ui_TIL, //[INPUT] TI 1); //[INPUT] M-mode //3D-M app03_MIA_tlmout(uc_nodeId, //[INPUT] SensorID pCtrl->uc_vet_cmp_ena, //[INPUT] 圧縮フラグ Gst_MEA_dat.us_Mlen2, //[INPUT] data長さ uc_se_mode, //[INPUT] Comment2 3, //[INPUT] Comment3 Gst_MEA_dat.us_3DM, //[INPUT] Product (unsigned short*)G03uc_data, //[MID] COMPRESSED BUF Gst_MEA_dat.ui_TIL, //[INPUT] TI 1); //[INPUT] M-mode if (pCtrl->us_spinNo%16 == 15 || pCtrl->us_Llen_ttl > 750) { app03_MIA_tlmout(uc_nodeId, //[INPUT] SensorID pCtrl->uc_vet_cmp_ena, //[INPUT] 圧縮フラグ pCtrl->us_Llen_ttl, //[INPUT] data長さ uc_se_mode + 0x40, //[INPUT] Comment2 Gst_MEA_dat.uc_infoL, //[INPUT] Comment3 us_Lbuf, //[INPUT] Product (unsigned short*)G03uc_data, //[MID] COMPRESSED BUF Gst_MEA_dat.ui_TIL, //[INPUT] TI 0); //[INPUT] L-mode pCtrl->us_Llen_ttl = 0; //RESET } //3D-LL(600s) app03_MIA_tlmout(uc_nodeId, //[INPUT] SensorID pCtrl->uc_vet_cmp_ena, //[INPUT] 圧縮フラグ Gst_MEA_dat.us_Llen2, //[INPUT] data長さ uc_se_mode, //[INPUT] Comment2 3, //[INPUT] Comment3 Gst_MEA_dat.us_3DM, //[INPUT] Product (unsigned short*)G03uc_data, //[MID] COMPRESSED BUF Gst_MEA_dat.ui_TIL, //[INPUT] TI 0); //[INPUT] L-mode //カウンタをリセット if (pCtrl->us_spinNo == 159) pCtrl->us_spinNo = 0xffff; //次スピン時はこのTI直後のブロックから走査する Gui_TLMm_blockTime[uc_nodeId] = t_blockInfo.ui_createTime; } } //if (uc_find_pac1 && i_numNewBlock - i > 1) //1spin分データが揃わない、かつBlockが残っている場合はブロックTIを更新する // Gui_TLMm_blockTime[uc_nodeId] = t_blockInfo.ui_createTime;//次スピン時はこのTI直後のブロックから走査する if (!uc_find_pac1) //1spin分データが揃った状態でBlock終了 Gui_TLMm_blockTime[uc_nodeId] = t_blockInfo.ui_createTime;//次スピン時はこのTI直後のブロックから走査する else if (uc_pckt == 0xff) //最後のパケットがダミーパケット Gui_TLMm_blockTime[uc_nodeId] = t_blockInfo.ui_createTime;//次スピン時はこのTI直後のブロックから } //ブロック数が1で頭有、お尻無し --> !!!バッファ切り替えの可能性!!! if ((uc_find_pac1 && i_numNewBlock == 1) || (uc_find_pac1 && i_numNewBlock == 2 && uc_en_mode == 4)) { i_bufId2 = app_CheckNonProcBlock ( uc_nodeId, 0, // [INPUT] Node/Data ID t_blockInfo.ui_createTime, // [INPUT] TI of Processed Block & ui_timeData); // [OUTPUT] TI of Newest Block in the selected buffer *** // (return) Buffer-ID (0:L, 1:S, -1:no data) *** if ( i_bufId2 >= 0 && i_bufId != i_bufId2) { //バッファ切り替えが1スピンデータの切れ目に有り Gui_TLMm_blockTime[uc_nodeId] = t_blockInfo.ui_createTime;//次スピン時はこのTI直後のブロックから // Newest Block-- Set at the oldest non-processed block -- i_numNewBlock2 = app_SetNonProcBlock(uc_nodeId, 0, // [INPUT] Node/Data ID i_bufId2, // [INPUT] Buffer ID Gui_TLMm_blockTime[uc_nodeId], // [INPUT] TI of Processed Block &t_blockInfo); // [OUTPUT] Block Info *** // (return) >0:Num of blocks, <=0:No data (error) *** if ( i_numNewBlock2 > 3) i_numNewBlock2 = 3; if ( i_numNewBlock2 >= 1 ) { i_numNewBlock += i_numNewBlock2; i_bufId = i_bufId2; continue; } } } //次のブロックへ i_flag = app_NextBlock( uc_nodeId, 0, // [INPUT] Node/Data ID i_bufId, // [INPUT] Buffer ID &t_blockInfo); // [OUTPUT] Block Info if ( i_flag ) break; // no data } //DEBUG #ifdef _GET_WORKING_TIME_MEA__03 dpu_getTime( &t_timeInfo); ui_tmp2 = t_timeInfo.ui_currentTime2; ui_tmp3 = ui_tmp2 - ui_tmp1; pCtrl->ui_eng_vmf = ui_tmp3; #endif return TRUE; } void app03_MEA_makeSWcal(unsigned char uc_nodeId, //[INPUT]Node ID: Gd_N_MEA1or2 unsigned short us_pac[], // [OUTPUT] カウンタデータ unsigned char uc_modeNo) // [INPUT] モード番号 // (return) { int i, j, k; int i_en_num, i_cell, i_sc, i_hd; struct _s_MEA_CtrlParam *pCtrl; //制御用のフラグ及びパラメータ i_sc = d_Lcl_MEA_PACSZ/2; //Size of sector(packet) at USHORT i_hd = d_Lcl_MEA_HDRSZ/2; //Size of header in packet if (uc_nodeId == Gd_N_MEA1) pCtrl = &Gst_MEA1_ctrl; else pCtrl = &Gst_MEA2_ctrl; if (uc_modeNo == 4) i_en_num = 64; else i_en_num = 32; //カウンタデータ //M2 [16sc][32en][16ch] //M4 [16sc][32en][16ch] + [16sc][32en][16ch] for (j = 0; j < 16; j++) { for (k = 0; k < i_en_num; ++k) { for ( i = 0; i < 16; ++i) { if (uc_modeNo == 4) { if (k < 32) i_cell = i_hd + i + k*16 + 2*j*i_sc; else i_cell = i_hd + i + (k-32)*16 + (2*j + 1)*i_sc; } else i_cell = i_hd + i + k*16 + j*i_sc; if ( (j == pCtrl->uc_swcal_prm[3] || pCtrl->uc_swcal_prm[3] == 0xff) && (i == pCtrl->uc_swcal_prm[2] || pCtrl->uc_swcal_prm[2] == 0xff) && (k == pCtrl->uc_swcal_prm[1] || pCtrl->uc_swcal_prm[1] == 0xff) ) { if (pCtrl->uc_swcal_prm[4] == 0) us_pac[i_cell] = k; else us_pac[i_cell] = pCtrl->uc_swcal_prm[4]; } else us_pac[i_cell] = 0; }}} return; } // Making M-mode product // MEA1 Et-OMN(4s), Et-PAP(4s), VM(4s) 4CHs are dead. // MEA2 Et-OMN(2s), Et-PAP(2s), VM(2s) int app03_MEA_makeM(unsigned char uc_nodeId, //[INPUT]Node ID: Gd_N_MEA1or2 unsigned int ui_sunpulseCnt, //[INPUT] Sunpulse counter from MDP unsigned short us_cnt[], //[INPUT]counter data unsigned short *pus_outbuf, //[OUTPUT] Product unsigned short *pus_outbuf3DM) //[OUTPUT] Product(3D-M) { int i, j, k, n, i_2s; int i_en, i_gf, j_pap, i_cell; int i_sc, i_hd; unsigned char uc_DataID, uc_pot, uc_chall; unsigned short *pus_addr; unsigned short us_gf[16]; unsigned int ui_ttl_ch[16], ui_ttl, ui_et0, ui_et1, ui_et2, ui_et3; short s_cosp_tmp, s_cosp[16]; #ifdef _RUN_ON_WINDOWS_ unsigned short us_win[13*6*2]; #endif struct _s_MEA_Product *pDat; //Product common struct _s_MEA_ProcParam *pP; //Lookup table MEA1or2 struct _s_MEA_CtrlParam *pCtrl; //Control pram. MEA1or2 pDat = &Gst_MEA_dat; if (uc_nodeId == Gd_N_MEA1) { pP = &Gst_MEA1_proc; pCtrl = &Gst_MEA1_ctrl; uc_chall = d_Lcl_MEA1_2sM; } else { pP = &Gst_MEA2_proc; pCtrl = &Gst_MEA2_ctrl; uc_chall = d_Lcl_MEA2_2sM; } i_sc = d_Lcl_MEA_PACSZ/2; //Size of sector(packet) at USHORT i_hd = d_Lcl_MEA_HDRSZ/2; //Size of header in packet uc_DataID = (uc_chall) ? 1 : 0; //Set DATA-ID // Enegy Table Number T0-3 (should be 1-3) // 0: 64 Photoelectron 1-3: 32 i_en = pCtrl->uc_en_tbl; if (i_en > 3 || i_en < 1) i_en = 1; //G-factor Mode Number 0-4(0,1,2,4,8) if (pDat->uc_hdr[6] == 0) i_gf = 0; else if (pDat->uc_hdr[6] == 1) i_gf = 1; else if (pDat->uc_hdr[6] == 2) i_gf = 2; else if (pDat->uc_hdr[6] == 4) i_gf = 3; else if (pDat->uc_hdr[6] == 8) i_gf = 4; else i_gf = 0; if (pCtrl->uc_gf_no <= 4) pCtrl->uc_gf_no = i_gf; //pCtrl->uc_gf_no = 5-6 is used for MEA2 gf0&T3 //Et-OMN[32en](2s or 4s) using 16CHs //Init. for (i = 0; i < 32*2; ++i) pDat->ui_MEtO[i] = 0; for (i = 0; i < 16; ++i) ui_ttl_ch[i] = 0; //Set table (0の時は0) for (i = 0; i < 16; ++i) { us_gf[i] = (pP->uc_gf[i + i_gf*16]) ? d_Lcl_MEA_TBL_GF0 + pP->uc_gf[i + i_gf*16] : 0; s_cosp_tmp = pP->s_csp0[i] + pP->c_csp[i + i_gf*16]; s_cosp[i] = (s_cosp_tmp >= 0) ? s_cosp_tmp : -s_cosp_tmp; } for (k = 0; k < 32; ++k) {//energy step ui_et2 = 0; ui_et3 = 0; for (i = 0; i < 16; ++i) {//channel ui_et0 = 0; ui_et1 = 0; //sector(sweep) for (j = 0; j < 8; ++j) ui_et0 += us_cnt[i_hd + i + k*16 + j*i_sc]; for (j = 8; j < 16; ++j) ui_et1 += us_cnt[i_hd + i + k*16 + j*i_sc]; ui_ttl_ch[i] += ui_et0 + ui_et1; ui_et2 += ui_et0*us_gf[i]*s_cosp[i]; ui_et3 += ui_et1*us_gf[i]*s_cosp[i]; } pDat->ui_MEtO[k] += ui_et2*16/d_Lcl_MEA_TBL_GF/d_Lcl_MEA_TBL_RD1; //規格化と桁調整(0x10) pDat->ui_MEtO[k+32] += ui_et3*16/d_Lcl_MEA_TBL_GF/d_Lcl_MEA_TBL_RD1; } //Make the products of (2s) when 16CHs are alive if (!uc_chall) for (k = 0; k < 32; ++k) pDat->ui_MEtO[k] += pDat->ui_MEtO[k+32]; #ifdef _RUN_ON_WINDOWS_ //gf printf("us_gf[16]: "); for (i = 0; i < 16; ++i) printf("%003x ", us_gf[i]); printf("¥n"); printf("Et-OMNm[32en](2s or 4s): ¥n"); for (i = 0; i < 8; ++i) printf("%00000008x ", pDat->ui_MEtO[i]); printf("¥n"); for (i = 8; i < 16; ++i) printf("%00000008x ", pDat->ui_MEtO[i]); printf("¥n"); for (i = 16; i < 24; ++i) printf("%00000008x ", pDat->ui_MEtO[i]); printf("¥n"); for (i = 24; i < 32; ++i) printf("%00000008x ", pDat->ui_MEtO[i]); printf("¥n"); if (uc_chall) { for (i = 0; i < 8; ++i) printf("%00000008x ", pDat->ui_MEtO[i+32]); printf("¥n"); for (i = 8; i < 16; ++i) printf("%00000008x ", pDat->ui_MEtO[i+32]); printf("¥n"); for (i = 16; i < 24; ++i) printf("%00000008x ", pDat->ui_MEtO[i+32]); printf("¥n"); for (i = 24; i < 32; ++i) printf("%00000008x ", pDat->ui_MEtO[i+32]); printf("¥n"); } #endif // ################### Autmatic GF changing ################### ui_ttl = 0; for (i = 0; i < 16; ++i) ui_ttl += ui_ttl_ch[i]; //Increasing g-factor if (ui_ttl < d_Lcl_MEA_GCNT_LL) pCtrl->uc_gf_spn_inc++; else pCtrl->uc_gf_spn_inc = 0; //Deccreasing g-factor for (i = 0; i < 16; ++i) { if (ui_ttl_ch[i] > d_Lcl_MEA_GCNT_UL*4) { pCtrl->uc_gf_spn_dec++; break; } if (i == 15) pCtrl->uc_gf_spn_dec = 0; } //pCtrl->ui_eng_vmf = ui_ttl; //<<<<<<<< デバッグ用 // ############################################################ //Et-PAP[4en][16ch](2s or 4s) select the sector including B j_pap = app03_MEA_getSCfromMGF(pCtrl->uc_B_mode, pCtrl->uc_B_sec, pDat->ui_TIL); j = j_pap; for (i = 0; i < 16*4*2; ++i) pDat->ui_MEtP[i] = 0; //Init. for (n = 0; n < 4; ++n) { //4 energy steps for (k = pCtrl->uc_ep[n+1]; k <= pCtrl->uc_ep[n+1] + pCtrl->uc_ep[0]; ++k) { //4 points and width from CMD if (k > 31) continue; for (i = 0; i < 16; ++i) { //channel i_cell = i_hd + i + k*16 + j*i_sc; pDat->ui_MEtP[i + 16*n] += us_cnt[i_cell]; if (uc_chall) pDat->ui_MEtP[i + 16*n +64] = us_cnt[i_cell + i_sc*8]; // 8sector shift << 2018.05.10改訂 // in case of the product of 2s } } } #ifdef _RUN_ON_WINDOWS_ printf("Et-PAPm[4en][16ch](2s or 4s): ¥n"); for (n = 0; n < 4; ++n) { for (i = 0; i < 16; ++i) printf("%0004x ", pDat->ui_MEtP[i + 16*n]); printf("¥n"); } if (uc_chall) { for (n = 0; n < 4; ++n) { for (i = 0; i < 16; ++i) printf("%0004x ", pDat->ui_MEtP[i + 16*n + 64]); printf("¥n"); } } #endif //Velocity Moment //for (i = 0; i < 13*6*2; ++i) pDat->f_MVM[i] = 1.; //Init. for DEBUG app03_MEA_calVM(uc_nodeId, //[INPUT] SENSOR ID: MEA1/2 pDat->ui_TIL, //[INPUT] TI us_cnt, //[INPUT] counter data i_en, //[INPUT] Energy table number i_gf, //[INPUT] g-factor ctrl mode number &uc_pot, //[OUTPUT] Largest en# (potential) used for VM cal. pDat->f_MVM); //[OUTPUT] Product VM #ifdef _RUN_ON_WINDOWS_ printf("VM(2s or 4s): ¥n"); printf("nV/n(x,y,z): %e %e %e ¥n", pDat->f_MVM[1]/pDat->f_MVM[0]*0xffff/d_Lcl_MEA_V_OR, pDat->f_MVM[2]/pDat->f_MVM[0]*0xffff/d_Lcl_MEA_V_OR, pDat->f_MVM[3]/pDat->f_MVM[0]*0xffff/d_Lcl_MEA_V_OR); printf("P/n(xx,yy,zz): %e %e %e ¥n", pDat->f_MVM[4]/pDat->f_MVM[0]*0xffff*0xffff/d_Lcl_MEA_P_OR, pDat->f_MVM[5]/pDat->f_MVM[0]*0xffff*0xffff/d_Lcl_MEA_P_OR, pDat->f_MVM[6]/pDat->f_MVM[0]*0xffff*0xffff/d_Lcl_MEA_P_OR); printf("q/n(x,y,z): %e %e %e ¥n", pDat->f_MVM[10]/pDat->f_MVM[0]*0xffff*0xffff*0xffff/d_Lcl_MEA_H_OR, pDat->f_MVM[11]/pDat->f_MVM[0]*0xffff*0xffff*0xffff/d_Lcl_MEA_H_OR, pDat->f_MVM[12]/pDat->f_MVM[0]*0xffff*0xffff*0xffff/d_Lcl_MEA_H_OR); for (n = 0; n < 6; ++n) { for (i = 0; i < 13; ++i) printf("%.2e ", pDat->f_MVM[i + 13*n]); printf("¥n"); } if (uc_chall) { for (n = 0; n < 6; ++n) { for (i = 0; i < 13; ++i) printf("%.2e ", pDat->f_MVM[i + 13*n + 78]); printf("¥n"); } } i_2s = (uc_chall) ? 2 : 1; app03_MIA_DBLtoUSHORT(pDat->f_MVM, us_win, 78*i_2s); for (n = 0; n < 6; ++n) { for (i = 0; i < 13; ++i) printf("%0004x ", us_win[i + 13*n]); printf("¥n"); } if (uc_chall) { for (n = 0; n < 6; ++n) { for (i = 0; i < 13; ++i) printf("%0004x ", us_win[i + 13*n +76]); printf("¥n"); } } #endif //INF pDat->uc_hdr2[0] = ((pCtrl->uc_ep[0] & 0x3f) << 2) | ((pCtrl->uc_ep[1] & 0x3f) >> 4); pDat->uc_hdr2[1] = ((pCtrl->uc_ep[1] & 0x3f) << 4) | ((pCtrl->uc_ep[2] & 0x3f) >> 2); pDat->uc_hdr2[2] = ((pCtrl->uc_ep[2] & 0x3f) << 6) | ((pCtrl->uc_ep[3] & 0x3f) ); pDat->uc_hdr2[3] = ((pCtrl->uc_ep[4] & 0x3f) << 2); pDat->uc_hdr2[4] = j_pap; pDat->uc_hdr2[5] = uc_pot; //Largest en# (potential) used for VM cal. pDat->uc_hdr2[6] = pCtrl->uc_stpe_no; //en# of sweep stopping pDat->uc_hdr2[7] = i_en; //Energy table# #ifdef _RUN_ON_WINDOWS_ printf("INF(2s or 4s): ¥n"); for (i = 0; i < 5; ++i) printf("%02x ", pCtrl->uc_ep[i]); printf("¥n"); for (i = 4; i < 8; ++i) printf("%02x ", pDat->uc_hdr2[i]); printf("¥n"); #endif // #### プロダクトを並べる#### i_2s = (uc_chall) ? 2 : 1; //Set (2s) or (4s) //pus_addr = (uc_chall) ? pus_outbuf : pus_outbuf + d_Lcl_MEA_MD2B; //3D-Mが基準 pus_addr = pus_outbuf; memcpy(pus_addr, pDat->uc_hdr, d_Lcl_MEA_HK2B*2); pus_addr += d_Lcl_MEA_HK2B; //HDR of #1 memcpy(pus_addr, pDat->uc_hdr2, d_Lcl_MEA_IF2B*2); pus_addr += d_Lcl_MEA_IF2B; //INF //app03_MIA_UINTtoUSHORT(pDat->ui_MEtO, pus_addr, 32*i_2s); pus_addr += 32*i_2s; //Et-OMN(2s,4s) app04_ENA_Lin2Log(pDat->ui_MEtO, (unsigned char *) pus_addr, 32*i_2s*4, 0, 0); pus_addr += 16*i_2s; //memcpy(pus_addr, pDat->us_MEtP, 2*64*i_2s); pus_addr += 64*i_2s; //Et-PAP(2s,4s) app04_ENA_Lin2Log(pDat->ui_MEtP, (unsigned char *) pus_addr, 4*64*i_2s, 1, 0); pus_addr += 32*i_2s; app03_MIA_DBLtoUSHORT(pDat->f_MVM, pus_addr, 78*i_2s); //VM(2s,4s) pDat->us_Mlen = d_Lcl_MEA_HK2B + d_Lcl_MEA_IF2B + (16+32+13*6)*i_2s; //データ長 pDat->uc_infoM = uc_DataID + pCtrl->uc_pot_mode*0x10; //コメント //--> 3D-M[16en][88cell](4s or 8s) if ( (uc_nodeId == Gd_N_MEA1 && d_Lcl_MEA1_3DM) || (uc_nodeId == Gd_N_MEA2 && d_Lcl_MEA2_3DM) ) { pus_addr = pus_outbuf3DM; memcpy(pus_addr, pDat->uc_hdr, d_Lcl_MEA_HK2B*2); //HDR of #1 if (pCtrl->uc_mode <= 3 || pCtrl->uc_mode == 5 || pCtrl->uc_mode == 0x0f) { //SCI mode 0-3&5 if (!(pCtrl->us_spinNo & 0x01)) { //1st spin of 2 app03_MEA_put3D(us_cnt, //[INPUT]counter data pus_outbuf3DM + d_Lcl_MEA_HK2B); //[OUTPUT] Product if (pCtrl->uc_snap_ave) pDat->us_Mlen2 = d_Lcl_MEA_HK2B + 88*16; //SNAPSHOT時は3D-MをここでTLMへ else pDat->us_Mlen2 = 0; } else { //2nd spin of 2 if (pCtrl->uc_snap_ave) pDat->us_Mlen2 = 0; //SNAPSHOT時はプロダクト無し else { pDat->us_Mlen2 = d_Lcl_MEA_HK2B + 88*16; //AVERAGE時は3D-MをここでTLMへ app03_MEA_3D(us_cnt, //[INPUT] counter data pus_addr, //[OUTPUT]Product 1); //[INPUT] 1:M 0-7ch } } } else { //SCI4, 6-8 pDat->us_Mlen2 = d_Lcl_MEA_HK2B + 88*16; app03_MEA_put3D(us_cnt, //[INPUT]counter data pus_outbuf3DM + d_Lcl_MEA_HK2B); //[OUTPUT] Product } //3D-LL(600s)としてTLM if (pCtrl->us_spinNo == d_Lcl_MEA_3DLL) //1st spin of 2 pDat->us_Llen2 = d_Lcl_MEA_HK2B + 88*16; } #ifdef _RUN_ON_WINDOWS_ if (pDat->us_Mlen2) { for (j = 0; j < 88; ++j) { for (i = 0; i < 16; ++i) printf("%0004x ", *(pus_outbuf3DM + i + j*16) ); printf("¥n"); } } #endif //### SHARED DATA ### for (i = 0; i < Gd_TRG_MAX; ++i) { if (Gui_TRG1_SpTI_s[i] <= pDat->ui_TIL || Gui_TRG1_SpTI_s[i] +2048 > pDat->ui_TIL) break; } if (i < Gd_TRG_MAX) { if (pDat->f_MVM[0] > 0) Gus_TRG1_MEA_T[i] = (unsigned short)( (pDat->f_MVM[4] + pDat->f_MVM[5] + pDat->f_MVM[6])/pDat->f_MVM[0]*0xfff); else Gus_TRG1_MEA_T[i] = 0; } return (TRUE); } int app03_MEA_getSCfromMGF(unsigned char uc_mode, unsigned char uc_sec, unsigned int ui_TI) //[INPUT] TI //[return] sector # from MGF data { int i; int j_pap = 0; //Use CMD value if (!uc_mode) return(uc_sec); //Use value from MGF data for (i = 0; i < Gd_TRG_MAX; ++i) { if (Gui_TRG1_SpTI_s[i] <= ui_TI || Gui_TRG1_SpTI_s[i] +2048 > ui_TI) break; } if (i < Gd_TRG_MAX) { if (Gs_TRG1_MGFO_Bx[i] == 0) j_pap = 0; else j_pap = (int) ( app_math_atan((double)Gs_TRG1_MGFO_By[i]/Gs_TRG1_MGFO_Bx[i])/MATH_PI*8 );//Magnetic field phase //戻り値: 偏角(radian,0 ≦ θ < 2π)0-4 or 12-16 j_pap += 4 + uc_sec; //x-axis:sec=4, uc_secはコマンドによるOFFSET if (j_pap >= 16) j_pap -= 16; if (j_pap >= 8) j_pap -= 8; if (j_pap < 0) j_pap = 0; if (j_pap >= 8) j_pap = 0; } return (j_pap); } int app03_MEA_calVM(unsigned char uc_nodeId, //[INPUT] SENSOR ID: MEA1/2 unsigned int ui_TI, //[INPUT] TI unsigned short us_cnt[], //[INPUT] counter data int i_en, //[INPUT] Energy table number int i_gf, //[INPUT] g-factor ctrl mode number unsigned char *puc_pot, //[OUTPUT] Largest en# (Potential) used for VM cal. double f_VM[]) //[OUTPUT] Product) { int i, j, k, k2, n, i_2s; int i_en_pot, i_en_pot2; int i_c, i_cs, i_cell, i_ch_num; int i_sc, i_hd; double f_potA, f_potB, f_pot, f_vp, f_vk; unsigned short us_v[32], us_gf2[16], us_vf[16]; double f_VMt[4]; unsigned char uc_chall, ucf[32]; short s_cosp, s_sinp, s_cosa, s_sina; struct _s_MEA_ProcParam *pP; //解析用パラメータ MEA1or2 struct _s_MEA_CtrlParam *pCtrl; //制御用のフラグ及びパラメータ MEA1or2 if (uc_nodeId == Gd_N_MEA1) { pP = &Gst_MEA1_proc; pCtrl = &Gst_MEA1_ctrl; uc_chall = d_Lcl_MEA1_2sM; } else { pP = &Gst_MEA2_proc; pCtrl = &Gst_MEA2_ctrl; uc_chall = d_Lcl_MEA2_2sM; } i_sc = d_Lcl_MEA_PACSZ/2; //Size of sector(packet) at USHORT i_hd = d_Lcl_MEA_HDRSZ/2; //Size of header in packet //i_ch_num = (uc_chall) ? 16 : 8; //Set number (8 or 16) of CH to use i_ch_num = 16; // >>>>>(2012.11.16) Dead CH was treated by gf=0 i_en_pot = 32; //VM cal i_en_pot2 = 32; //Limit of energy sweep pCtrl->uc_stpe_no = 31; //Stop En mode on //Set table flag for (k = 0; k < 32; ++k) ucf[k] = pCtrl->ui_eng_vmf >> k & 0x01; //Set table for (i = 0; i < 16; ++i) { us_gf2[i] = (pP->uc_gf2[i + i_gf*16]) ? d_Lcl_MEA_TBL_GF0 + pP->uc_gf2[i + i_gf*16] : 0; us_vf[i] = d_Lcl_MEA_TBL_VF0 + pP->uc_vf[i + i_gf*16]; } // S/C potential if (pCtrl->uc_pot_mode) { //Search TI and select potential data for (i = 0; i < Gd_TRG_MAX; ++i) if (Gui_TRG2_SpTI_s[i] < ui_TI) break; if (i < Gd_TRG_MAX) f_pot = (double)Gs_TRG2_EFD_Pot[i]*d_Lcl_MEA_MAX_POT/0x7fff; //(Volt) else f_pot = 0.; //(Volt) // Pot = A*p + B f_potA = (double)d_Lcl_MEA_MAX_POT*(pCtrl->us_pot_A - d_Lcl_MEA_TBL_POT)/d_Lcl_MEA_TBL_POT; f_potB = (double)d_Lcl_MEA_MAX_POT*(pCtrl->us_pot_B - d_Lcl_MEA_TBL_POT)/d_Lcl_MEA_TBL_POT; f_pot = f_potA*f_pot + f_potB; //(Volt) if (f_pot >= 0) { //Positive potential f_vp = d_Lcl_MEA_2qm*app_math_sqrt(f_pot); //v_pot(km/s) //Search v(k) > v(pot)*sqrt(2) for (k = 0; k < 32; ++k) { //Energy table MAX --> MIN f_vk = d_Lcl_MEA_MAX_V32*pP->us_v32[(i_en - 1)*32 + k]/0xffff; //v_mes(km/s) //Correcting factor by using S/C potential(+) if (f_vp < f_vk) us_v[k] = app_math_sqrt(1. - f_vp*f_vp/f_vk/f_vk)*d_Lcl_MEA_TBL_POT; else us_v[k] = 0; //End# of energy sweep by comparing with sqrt(2)*v(pot) if (f_vp*1.4142 > f_vk && i_en_pot == 32) i_en_pot = k; //comparing with v(pot) if (f_vp > f_vk && i_en_pot2 == 32) i_en_pot2 = k; } } else { //Negative potential f_vp = d_Lcl_MEA_2qm*app_math_sqrt(-f_pot); //v_pot(km/s) //Correcting velocity table by using S/C potential(-) for (k = 0; k < 32; ++k) { f_vk = d_Lcl_MEA_MAX_V32*pP->us_v32[(i_en - 1)*32 + k]/0xffff; us_v[k] = app_math_sqrt(1. + f_vp*f_vp/f_vk/f_vk)*d_Lcl_MEA_TBL_POT; } } } else { f_vp = 0.; //(V) //Correcting factor by using S/C potential(+) for (k = 0; k < 32; ++k) us_v[k] = d_Lcl_MEA_TBL_POT; } //Set cmd parameter: 1-32; pCtrl->uc_stpe_no = (!i_en_pot2)? 1 : i_en_pot2; *puc_pot = (unsigned char)i_en_pot; //OUTPUT at INF #ifdef _RUN_ON_WINDOWS_ // printf("f_potA = %f %f¥n", f_potA, f_potB); // printf("f_pot = %f (V)¥n", f_pot); // printf("Vpot = %f (km/s)¥n", f_vp); // for (k = 0; k < 32; ++k) { // printf("%.2f %.2e (km/s) %d¥n", (double)us_v[k]/d_Lcl_MEA_TBL_POT, // d_Lcl_MEA_MAX_V32*pP->us_v32[(i_en - 1)*32 + k]/0xffff, // pP->us_v32[(i_en - 1)*32 + k]); // } #endif for (i = 0; i < 13*6*2; ++i) f_VM[i] = 0.; //Init. for (j = 0; j < 16; ++j) {//sector(sweep) i_2s = (uc_chall && j >= 8) ? 13*6 : 0; for (i = 0; i < i_ch_num; ++i) {//channel <<<<<<<<<< using 8CHs or 16CHs if (!us_gf2[i]) continue; //Dead CH i_c = i + 16*i_gf; i_cs = i + 16*j + 256*i_gf; for (n = 0; n < 4; ++n) f_VMt[n] = 0.; //初期化 for (k = 0; k < i_en_pot; ++k) {//energy step Max(i=0) --> over 2*Vpot=sqrt(2)*v(pot) k2 = (i_en - 1)*32 + k; if (!pP->us_v32[k2] || !ucf[k]) continue; //0割、Vテーブル不使用FLG時はスキップ i_cell = i_hd + i + k*16 + j*i_sc; //if (us_cnt[i_cell] != 0) printf("us_v[%d] = %d¥n", k, us_v[k]); f_vp = (double)us_cnt[i_cell]/pP->us_v32[k2]*us_v[k]; f_VMt[0] += f_vp; f_vp *= pP->us_v32[k2]*us_v[k]; f_VMt[1] += f_vp; f_vp *= pP->us_v32[k2]*us_v[k]; f_VMt[2] += f_vp; f_vp *= pP->us_v32[k2]*us_v[k]; f_VMt[3] += f_vp; f_vp *= pP->us_v32[k2]*us_v[k]; } s_cosp = pP->s_csp0[i] + pP->c_csp[i_c]; s_sinp = pP->s_snp0[i] + pP->c_snp[i_c]; s_cosa = pP->s_csa0[j] + pP->c_csa[i_cs]; s_sina = pP->s_sna0[j] + pP->c_sna[i_cs]; f_vk = (s_cosp >= 0) ? (double)us_gf2[i]*s_cosp : (double)us_gf2[i]*(-s_cosp); //f_vk再利用 f_VMt[0] *= f_vk/us_vf[i]; f_VMt[1] *= f_vk; f_VMt[2] *= f_vk*us_vf[i]; f_VMt[3] *= f_vk*us_vf[i]*us_vf[i]; f_VM[ 0 +i_2s] += f_VMt[0]; f_VM[ 1 +i_2s] += f_VMt[1]*s_cosp *s_cosa; f_VM[ 2 +i_2s] += f_VMt[1]*s_cosp *s_sina; f_VM[ 3 +i_2s] += f_VMt[1]*s_sinp; f_VM[ 4 +i_2s] += f_VMt[2]*s_cosp*s_cosp*s_cosa*s_cosa; f_VM[ 5 +i_2s] += f_VMt[2]*s_cosp*s_cosp*s_sina*s_sina; f_VM[ 6 +i_2s] += f_VMt[2]*s_sinp*s_sinp; f_VM[ 7 +i_2s] += f_VMt[2]*s_cosp*s_cosp*s_cosa*s_sina; f_VM[ 8 +i_2s] += f_VMt[2]*s_cosp*s_sinp*s_sina; f_VM[ 9 +i_2s] += f_VMt[2]*s_cosp*s_sinp*s_cosa; f_VM[10 +i_2s] += f_VMt[3]*s_cosp*s_cosa; f_VM[11 +i_2s] += f_VMt[3]*s_cosp*s_sina; f_VM[12 +i_2s] += f_VMt[3]*s_sinp; } } for (n = 1; n < 6; ++n) { for (j = 0; j < 16; ++j) {//sector(sweep) i_2s = (uc_chall && j >= 8) ? 13*6 : 0; for (i = 0; i < i_ch_num; ++i) {//channel <<<<<<<<<< using 8CHs or 16CHs if (!us_gf2[i]) continue; //Dead CH i_c = i + 16*i_gf; i_cs = i + 16*j + 256*i_gf; //5 points below 2*Vpot=sqrt(2)*v(pot) if (i_en_pot < 27) k = i_en_pot + n - 1; else k = 27 + n - 1; i_cell = i_hd + i + k*16 + j*i_sc; //f_vp = (double)pP->us_v32[(i_en - 1)*32 + k]*us_vf[i]; //if (f_vp <= 0) continue; if (!us_vf[i]) continue; s_cosp = pP->s_csp0[i] + pP->c_csp[i_c]; s_sinp = pP->s_snp0[i] + pP->c_snp[i_c]; s_cosa = pP->s_csa0[j] + pP->c_csa[i_cs]; s_sina = pP->s_sna0[j] + pP->c_sna[i_cs]; f_vk = (s_cosp >= 0) ? (double)us_gf2[i]*s_cosp : (double)us_gf2[i]*(-s_cosp); //f_vk再利用 f_VMt[0] = f_vk*us_cnt[i_cell]/us_vf[i]; f_VMt[1] = f_vk*us_cnt[i_cell]; f_VMt[2] = f_vk*us_cnt[i_cell]*us_vf[i]; f_VMt[3] = f_vk*us_cnt[i_cell]*us_vf[i]*us_vf[i]; f_VM[ 0 +13*n+i_2s] += f_VMt[0]; f_VM[ 1 +13*n+i_2s] += f_VMt[1]*s_cosp *s_cosa; f_VM[ 2 +13*n+i_2s] += f_VMt[1]*s_cosp *s_sina; f_VM[ 3 +13*n+i_2s] += f_VMt[1]*s_sinp; f_VM[ 4 +13*n+i_2s] += f_VMt[2]*s_cosp*s_cosp*s_cosa*s_cosa; f_VM[ 5 +13*n+i_2s] += f_VMt[2]*s_cosp*s_cosp*s_sina*s_sina; f_VM[ 6 +13*n+i_2s] += f_VMt[2]*s_sinp*s_sinp; f_VM[ 7 +13*n+i_2s] += f_VMt[2]*s_cosp*s_cosp*s_cosa*s_sina; f_VM[ 8 +13*n+i_2s] += f_VMt[2]*s_cosp*s_sinp*s_sina; f_VM[ 9 +13*n+i_2s] += f_VMt[2]*s_cosp*s_sinp*s_cosa; f_VM[10 +13*n+i_2s] += f_VMt[3]*s_cosp*s_cosa; f_VM[11 +13*n+i_2s] += f_VMt[3]*s_cosp*s_sina; f_VM[12 +13*n+i_2s] += f_VMt[3]*s_sinp; } } } //規格化と桁の調整 for (i = 0; i < 6*2; ++i) { if (i == 0 || i == 6) { f_VM[ 0 + 13*i] *= d_Lcl_MEA_N_OR/d_Lcl_MEA_N_NRM; f_VM[ 1 + 13*i] *= d_Lcl_MEA_V_OR/d_Lcl_MEA_V3_NRM; f_VM[ 2 + 13*i] *= d_Lcl_MEA_V_OR/d_Lcl_MEA_V3_NRM; f_VM[ 3 + 13*i] *= d_Lcl_MEA_V_OR/d_Lcl_MEA_V2_NRM; f_VM[ 4 + 13*i] *= d_Lcl_MEA_P_OR/d_Lcl_MEA_P5_NRM; f_VM[ 5 + 13*i] *= d_Lcl_MEA_P_OR/d_Lcl_MEA_P5_NRM; f_VM[ 6 + 13*i] *= d_Lcl_MEA_P_OR/d_Lcl_MEA_P3_NRM; f_VM[ 7 + 13*i] *= d_Lcl_MEA_P_OR/d_Lcl_MEA_P5_NRM; f_VM[ 8 + 13*i] *= d_Lcl_MEA_P_OR/d_Lcl_MEA_P4_NRM; f_VM[ 9 + 13*i] *= d_Lcl_MEA_P_OR/d_Lcl_MEA_P4_NRM; f_VM[10 + 13*i] *= d_Lcl_MEA_H_OR/d_Lcl_MEA_H3_NRM; f_VM[11 + 13*i] *= d_Lcl_MEA_H_OR/d_Lcl_MEA_H3_NRM; f_VM[12 + 13*i] *= d_Lcl_MEA_H_OR/d_Lcl_MEA_H2_NRM; } else { f_VM[ 0 + 13*i] *= d_Lcl_MEA_N_OR/d_Lcl_MEA_N_NRM1; f_VM[ 1 + 13*i] *= d_Lcl_MEA_V_OR/d_Lcl_MEA_V3_NRM1; f_VM[ 2 + 13*i] *= d_Lcl_MEA_V_OR/d_Lcl_MEA_V3_NRM1; f_VM[ 3 + 13*i] *= d_Lcl_MEA_V_OR/d_Lcl_MEA_V2_NRM1; f_VM[ 4 + 13*i] *= d_Lcl_MEA_P_OR/d_Lcl_MEA_P5_NRM1; f_VM[ 5 + 13*i] *= d_Lcl_MEA_P_OR/d_Lcl_MEA_P5_NRM1; f_VM[ 6 + 13*i] *= d_Lcl_MEA_P_OR/d_Lcl_MEA_P3_NRM1; f_VM[ 7 + 13*i] *= d_Lcl_MEA_P_OR/d_Lcl_MEA_P5_NRM1; f_VM[ 8 + 13*i] *= d_Lcl_MEA_P_OR/d_Lcl_MEA_P4_NRM1; f_VM[ 9 + 13*i] *= d_Lcl_MEA_P_OR/d_Lcl_MEA_P4_NRM1; f_VM[10 + 13*i] *= d_Lcl_MEA_H_OR/d_Lcl_MEA_H3_NRM1; f_VM[11 + 13*i] *= d_Lcl_MEA_H_OR/d_Lcl_MEA_H3_NRM1; f_VM[12 + 13*i] *= d_Lcl_MEA_H_OR/d_Lcl_MEA_H2_NRM1; } } return TRUE; } int app03_MEA_makeL(unsigned char uc_nodeId, //[INPUT]SENSOR ID: MEA1/2 unsigned int ui_sunpulseCnt,//[INPUT] Sunpulse counter from MDP unsigned short us_pac[], //[INPUT]counter data unsigned short *pus_outbuf) //[OUTPUT] Product { int i, k, n; unsigned int *ui_MEtO, *ui_LEtO, *ui_MEtP, *ui_LEtP; double *f_LVM, *f_MVM; unsigned short *us_3D;//, *us_MEtP, *us_LEtP unsigned char uc_16sf, uc_chall; unsigned short *pus_addr; unsigned char uc_se_mode; unsigned short us_len; struct _s_MEA_Product *pDat; //Product common struct _s_MEA_ProcParam *pP; //Lookup table MEA1or2 struct _s_MEA_CtrlParam *pCtrl; //Control pram. MEA1or2 pDat = &Gst_MEA_dat; if (uc_nodeId == Gd_N_MEA1) { pP = &Gst_MEA1_proc; pCtrl = &Gst_MEA1_ctrl; uc_chall = d_Lcl_MEA1_2sM; //using 8 or 16CHs ui_LEtP = pDat->ui_LEtP1; f_LVM = pDat->f_LVM1; } //(16s) else { pP = &Gst_MEA2_proc; pCtrl = &Gst_MEA2_ctrl; uc_chall = d_Lcl_MEA1_2sM; //using 8 or 16CHs ui_LEtP = pDat->ui_LEtP2; f_LVM = pDat->f_LVM2; }//(16s) ui_LEtO = pDat->ui_LEtO; ui_MEtO = pDat->ui_MEtO; ui_MEtP = pDat->ui_MEtP; f_MVM = pDat->f_MVM; us_3D = pDat->us_3DM; uc_16sf = FALSE; #ifdef _RUN_ON_WINDOWS_ pCtrl->us_spinNo = ui_sunpulseCnt; #endif //--> Et-OMN(4s)x2 [16en] for (k = 0; k < 16; ++k) {//energy step ui_LEtO[k] = ui_MEtO[2*k] + ui_MEtO[2*k+1]; if (uc_chall) ui_LEtO[k] += ui_MEtO[2*k +32] + ui_MEtO[2*k+1 +32]; // derived from (2s) } //--> Et-PAP(16s)x2 [4en][16ch] if (!(pCtrl->us_spinNo & 0x03)) { //1st spin of 4 for (i = 0; i < 4*16; ++i) ui_LEtP[i] = 0; //Init. for (i = 0; i < 13*6; ++i) f_LVM[i] = 0.; for (k = 0; k < 4*16; ++k) { //energy x channel ui_LEtP[k] += ui_MEtP[k]; if (uc_chall) ui_LEtP[k] += ui_MEtP[k +4*16]; // derived from (2s) } for (n = 0; n < 6*13; ++n) { //energy x sort f_LVM[n] += f_MVM[n]; if (uc_chall) f_LVM[n] += f_MVM[n +6*13]; // derived from (2s) } if (pCtrl->uc_snap_ave) uc_16sf = TRUE;//SNAPSHOT else uc_16sf = FALSE; } else if (!pCtrl->uc_snap_ave) { //2nd-4th spin of 4 at AVERAGE for (k = 0; k < 4*16; ++k) { //energy x channel ui_LEtP[k] += ui_MEtP[k]; if (uc_chall) ui_LEtP[k] += ui_MEtP[k +4*16]; // derived from (2s) } for (n = 0; n < 6*13; ++n) { //energy x sort f_LVM[n] += f_MVM[n]; if (uc_chall) f_LVM[n] += f_MVM[n +6*13]; // derived from (2s) } if ((pCtrl->us_spinNo & 0x03) == 3) uc_16sf = TRUE; //4th spin of 4 at AVERAGE else uc_16sf = FALSE; } //TLM用パケットに配置 pus_addr = pus_outbuf + pCtrl->us_Llen_ttl; uc_se_mode = pCtrl->uc_snap_ave + pCtrl->uc_eng_sci*2 + (pCtrl->uc_mode << 2 & 0x3c);//MPPE mode pDat->uc_infoL = pCtrl->uc_pot_mode*0x10 + uc_16sf*0x20; //Info(DataID=0) us_len = 2 + d_Lcl_MEA_HK2B + 8 + (d_Lcl_MEA_IF2B +32+78)*uc_16sf; //Data Length //先頭2B *pus_addr++ = uc_se_mode*0x100 + pDat->uc_infoL; //MPPE mode + MDPinfo *pus_addr++ = us_len*2; //データ長 //L products HDR Et-OMN (INF Et-PAP VM) memcpy(pus_addr, pDat->uc_hdr, d_Lcl_MEA_HK2B*2); pus_addr += d_Lcl_MEA_HK2B; //HDR of #1 //app03_MIA_UINTtoUSHORT(ui_LEtO, pus_addr, 16); pus_addr += 16; //Et-OMN app04_ENA_Lin2Log(ui_LEtO, (unsigned char *) pus_addr, 16*4, 0, 0); pus_addr += 8; if (uc_16sf) { memcpy(pus_addr, pDat->uc_hdr2, d_Lcl_MEA_IF2B*2); pus_addr += d_Lcl_MEA_IF2B; //INF //memcpy(pus_addr, us_LEtP, 64*2); pus_addr += 64; //Et-PAP app04_ENA_Lin2Log(ui_LEtP, (unsigned char *) pus_addr, 64*4, 1, 0); pus_addr += 32; app03_MIA_DBLtoUSHORT(f_LVM, pus_addr, 78); //pus_addr += 78; //VM(16s) } if (pCtrl->uc_mode < 0x0e || pCtrl->us_spinNo%8 > 3) //0x0e 0x0f 特殊モード、4/8でデータを間引く pCtrl->us_Llen_ttl += us_len; #ifdef _RUN_ON_WINDOWS_ printf("¥n¥n L-MODE PRODUCT¥n"); printf("Et-OMN(4s): ¥n"); for (n = 0; n < 8; ++n) printf("%00000008x ", ui_LEtO[n]); printf("¥n"); for (n = 8; n < 16; ++n) printf("%00000008x ", ui_LEtO[n]); printf("¥n"); if (uc_16sf) { printf("Et-PAP(16s): ¥n"); for (n = 0; n < 4; ++n) { for (i = 0; i < 16; ++i) printf("%0004x ", ui_LEtP[n*16 + i]); printf("¥n"); } for (n = 0; n < 6; ++n) { for (i = 0; i < 13; ++i) printf("%.2e ", f_LVM[n*13 + i]); printf("¥n"); } } #endif return (TRUE); } int app03_MEA_put3D(unsigned short *pus_inbuf, //[INPUT]counter data unsigned short *pus_outbuf) //[OUTPUT] Product { unsigned short *pus_addr; int i; pus_addr = pus_outbuf; for (i = 0; i < 88*16; ++i) *pus_addr++ = 0; //Init. app03_MEA_3D(pus_inbuf, pus_outbuf, 1); return (TRUE); } //To make M-mode Producst for MEA1 in M4 // and possible for MEA2 in M4 int app03_MEA_makeM64(unsigned char uc_nodeId, //[INPUT]SENSOR ID: 0/1 = MEA1/2 unsigned int ui_sunpulseCnt,//[INPUT] Sunpulse counter from MDP unsigned short us_cnt[], //[INPUT]counter data unsigned short *pus_outbuf) //[OUTPUT] Product { int i, j, k, n, i_2s, j_pap; int i_gf; int i_cell, i_sc, i_hd; unsigned short *pus_addr, us_gf[16]; unsigned int ui_et0, ui_et1, ui_et2, ui_et3; short s_cosp[16]; struct _s_MEA_Product *pDat; //Product common struct _s_MEA_ProcParam *pP; //Lookup table MEA1or2 struct _s_MEA_CtrlParam *pCtrl; //Control pram. MEA1or2 pDat = &Gst_MEA_dat; if (uc_nodeId == Gd_N_MEA1) { pP = &Gst_MEA1_proc; pCtrl = &Gst_MEA1_ctrl; } else { pP = &Gst_MEA2_proc; pCtrl = &Gst_MEA2_ctrl; } i_sc = d_Lcl_MEA_PACSZ/2; //Size of sector(packet) at USHORT i_hd = d_Lcl_MEA_HDRSZ/2; //Size of header in packet pDat->us_Mlen2 = 0; pDat->us_Llen2 = 0; //G-factor Mode Number 0-4(0,1,2,4,8) if (pDat->uc_hdr[6] == 0) i_gf = 0; else if (pDat->uc_hdr[6] == 1) i_gf = 1; else if (pDat->uc_hdr[6] == 2) i_gf = 2; else if (pDat->uc_hdr[6] == 4) i_gf = 3; else if (pDat->uc_hdr[6] == 8) i_gf = 4; else i_gf = 0; //Et-OMNe[64en](2s) for (i = 0; i < 64*2; ++i) pDat->ui_MEtO[i] = 0; //Init. for (i = 0; i < 16; ++i) { us_gf[i] = (pP->uc_gf[i + i_gf*16]) ? d_Lcl_MEA_TBL_GF0 + pP->uc_gf[i + i_gf*16] : 0; s_cosp[i] = pP->s_csp0[i] + pP->c_csp[i + i_gf*16]; } for (k = 0; k < 64; ++k) {//energy step ui_et2 = 0; ui_et3 = 0; for (i = 0; i < 16; ++i) {//channel ui_et0 = 0; ui_et1 = 0; for (j = 0; j < 16; ++j) {//sector(sweep) if (k < 32) i_cell = i_hd + i + k*16 + 2*j*i_sc; else i_cell = i_hd + i + (k-32)*16 + (2*j+1)*i_sc; if (j < 8) ui_et0 += us_cnt[i_cell]; else ui_et1 += us_cnt[i_cell]; } ui_et2 += ui_et0*us_gf[i]*s_cosp[i]; ui_et3 += ui_et1*us_gf[i]*s_cosp[i]; } pDat->ui_MEtO[k] += ui_et2*16/d_Lcl_MEA_TBL_GF/d_Lcl_MEA_TBL_RD1; //規格化と桁調整(0x10) pDat->ui_MEtO[k + 64] += ui_et3*16/d_Lcl_MEA_TBL_GF/d_Lcl_MEA_TBL_RD1; } #ifdef _RUN_ON_WINDOWS_ printf("Et-OMNe(2s): ¥n"); for (i = 0; i < 8; ++i) printf("%00000008x ", pDat->ui_MEtO[i]); printf("¥n"); for (i = 8; i < 16; ++i) printf("%00000008x ", pDat->ui_MEtO[i]); printf("¥n"); for (i = 16; i < 24; ++i) printf("%00000008x ", pDat->ui_MEtO[i]); printf("¥n"); for (i = 24; i < 32; ++i) printf("%00000008x ", pDat->ui_MEtO[i]); printf("¥n"); for (i = 32; i < 40; ++i) printf("%00000008x ", pDat->ui_MEtO[i]); printf("¥n"); for (i = 40; i < 48; ++i) printf("%00000008x ", pDat->ui_MEtO[i]); printf("¥n"); for (i = 48; i < 56; ++i) printf("%00000008x ", pDat->ui_MEtO[i]); printf("¥n"); for (i = 56; i < 64; ++i) printf("%00000008x ", pDat->ui_MEtO[i]); printf("¥n"); for (i = 64; i < 72; ++i) printf("%00000008x ", pDat->ui_MEtO[i]); printf("¥n"); for (i = 72; i < 80; ++i) printf("%00000008x ", pDat->ui_MEtO[i]); printf("¥n"); for (i = 80; i < 88; ++i) printf("%00000008x ", pDat->ui_MEtO[i]); printf("¥n"); for (i = 88; i < 96; ++i) printf("%00000008x ", pDat->ui_MEtO[i]); printf("¥n"); for (i = 96; i <104; ++i) printf("%00000008x ", pDat->ui_MEtO[i]); printf("¥n"); for (i =104; i <112; ++i) printf("%00000008x ", pDat->ui_MEtO[i]); printf("¥n"); for (i =112; i <120; ++i) printf("%00000008x ", pDat->ui_MEtO[i]); printf("¥n"); for (i =120; i <128; ++i) printf("%00000008x ", pDat->ui_MEtO[i]); printf("¥n"); #endif //Et-PAPe[8en][16ch](2s) including B j_pap = app03_MEA_getSCfromMGF(pCtrl->uc_B_mode, pCtrl->uc_B_sec, pDat->ui_TIL); j = j_pap; for (n = 0; n < 8; ++n) { //8 energy steps for (k = pCtrl->uc_ep[n+1]; k <= pCtrl->uc_ep[n+1] + pCtrl->uc_ep[0]; ++k) { //8 points and width from CMD if (k > 63) continue; for (i = 0; i < 16; ++i) { //channel if (k < 32) i_cell = i_hd + i + k*16 + j*i_sc*2; else i_cell = 2*i_hd + i + k*16 + j*i_sc*2; pDat->ui_MEtP[i + 16*n ] = us_cnt[i_cell]; pDat->ui_MEtP[i + 16*n +128] = us_cnt[i_cell + 8*i_sc*2];//8sector shift } } } #ifdef _RUN_ON_WINDOWS_ printf("Et-PAPe(2s): ¥n"); for (n = 0; n < 8; ++n) { for (i = 0; i < 8; ++i) printf("%0004x ", pDat->ui_MEtP[i + 16*n]); printf("¥n"); for (i = 8; i < 16; ++i) printf("%0004x ", pDat->ui_MEtP[i + 16*n]); printf("¥n"); } for (n = 0; n < 8; ++n) { for (i = 0; i < 8; ++i) printf("%0004x ", pDat->ui_MEtP[i + 16*n +128]); printf("¥n"); for (i = 8; i < 16; ++i) printf("%0004x ", pDat->ui_MEtP[i + 16*n +128]); printf("¥n"); } #endif //INFe pDat->uc_hdr2[0] = ((pCtrl->uc_ep[0] & 0x3f) << 2) | ((pCtrl->uc_ep[1] & 0x3f) >> 4); pDat->uc_hdr2[1] = ((pCtrl->uc_ep[1] & 0x3f) << 4) | ((pCtrl->uc_ep[2] & 0x3f) >> 2); pDat->uc_hdr2[2] = ((pCtrl->uc_ep[2] & 0x3f) << 6) | ((pCtrl->uc_ep[3] & 0x3f) ); pDat->uc_hdr2[3] = ((pCtrl->uc_ep[4] & 0x3f) << 2) | ((pCtrl->uc_ep[5] & 0x3f) >> 4); pDat->uc_hdr2[4] = ((pCtrl->uc_ep[5] & 0x3f) << 4) | ((pCtrl->uc_ep[6] & 0x3f) >> 2); pDat->uc_hdr2[5] = ((pCtrl->uc_ep[6] & 0x3f) << 6) | ((pCtrl->uc_ep[7] & 0x3f) ); pDat->uc_hdr2[6] = ((pCtrl->uc_ep[8] & 0x3f) << 2); pDat->uc_hdr2[7] = j_pap; // #### プロダクトを並べる#### i_2s = 2; pus_addr = pus_outbuf; memcpy(pus_addr, pDat->uc_hdr, d_Lcl_MEA_HK2B*2); pus_addr += d_Lcl_MEA_HK2B; //HDR of #1 memcpy(pus_addr, pDat->uc_hdr2, d_Lcl_MEA_IF2B*2); pus_addr += d_Lcl_MEA_IF2B; //INFe //app03_MIA_UINTtoUSHORT(pDat->ui_MEtO, pus_addr, 64*i_2s); pus_addr += 64*i_2s; //Et-OMNe(2s) app04_ENA_Lin2Log(pDat->ui_MEtO, (unsigned char *) pus_addr, 4*64*i_2s, 0, 0); pus_addr += 32*i_2s; //memcpy(pus_addr, pDat->us_MEtP, 2*128*i_2s); //Et-PAPe(2s) app04_ENA_Lin2Log(pDat->ui_MEtP, (unsigned char *) pus_addr, 4*128*i_2s, 1, 0); pDat->us_Mlen = d_Lcl_MEA_HK2B + d_Lcl_MEA_IF2B + (32 + 64)*i_2s; //Data Length pDat->uc_infoM = 2 + pCtrl->uc_pot_mode*0x10; //Info. of COMMENT return (TRUE); } int app03_MEA_makeL64(unsigned char uc_nodeId, //[INPUT]SENSOR ID: MEA1/2 unsigned int ui_sunpulseCnt, //[INPUT] Sunpulse counter from MDP unsigned short us_pac[], //[INPUT]counter data unsigned short *pus_outbuf) //[OUTPUT] Product { int k, i; unsigned int *ui_MEtO, *ui_LEtO; unsigned int *ui_LEtP, *ui_MEtP; unsigned short *pus_addr; unsigned char uc_se_mode; unsigned short us_len; struct _s_MEA_Product *pDat; //プロダクト struct _s_MEA_ProcParam *pP; //解析用パラメータ MEA1or2 struct _s_MEA_CtrlParam *pCtrl; //制御用のフラグ及びパラメータ MEA1or2 pDat = &Gst_MEA_dat; if (uc_nodeId == Gd_N_MEA1) { //MEA1 pP = &Gst_MEA1_proc; pCtrl = &Gst_MEA1_ctrl; ui_LEtP = pDat->ui_LEtP1; } else { //MEA2 pP = &Gst_MEA2_proc; pCtrl = &Gst_MEA2_ctrl; ui_LEtP = pDat->ui_LEtP2; } ui_LEtO = pDat->ui_LEtO; ui_MEtO = pDat->ui_MEtO; ui_MEtP = pDat->ui_MEtP; //--> Et-OMNe(4s)[16en] <-(2s)[64en] for (k = 0; k < 16; ++k) {//energy step ui_LEtO[k] = ui_MEtO[4*k] + ui_MEtO[4*k+1] + ui_MEtO[4*k+2] + ui_MEtO[4*k+3] + ui_MEtO[4*k +64] + ui_MEtO[4*k+1 +64] + ui_MEtO[4*k+2 +64] + ui_MEtO[4*k+3 +64]; } #ifdef _RUN_ON_WINDOWS_ printf("#### L mode ####: ¥n"); printf("Et-OMNe(4s): ¥n"); for (i = 0; i < 8; ++i) printf("%00000008x ", ui_LEtO[i]); printf("¥n"); for (i = 8; i < 16; ++i) printf("%00000008x ", ui_LEtO[i]); printf("¥n"); #endif //--> Et-PAPe(4s)x2 [1en][16ch] <¥ (2s)[8en][16ch] for (i = 0; i < 16; ++i) ui_LEtP[i] = 0; for (k = 0; k < 8; ++k) { for (i = 0; i < 16; ++i)//energy x channel ui_LEtP[i] += ui_MEtP[i + 16*k] + ui_MEtP[i + 16*k + 128]; } #ifdef _RUN_ON_WINDOWS_ printf("Et-PAPe(4s): ¥n"); for (i = 0; i < 8; ++i) printf("%0004x ", ui_LEtP[i]); printf("¥n"); for (i = 8; i < 16; ++i) printf("%0004x ", ui_LEtP[i]); printf("¥n"); #endif //TLM用パケットに配置 pus_addr = pus_outbuf + pCtrl->us_Llen_ttl; uc_se_mode = pCtrl->uc_snap_ave + pCtrl->uc_eng_sci*2 + (pCtrl->uc_mode << 2 & 0x3c);//MPPE mode pDat->uc_infoL = 2 + pCtrl->uc_pot_mode*0x10; //Info(DataID=2) us_len = 2 + d_Lcl_MEA_HK2B + d_Lcl_MEA_IF2B + 8 + 8; //Data Length //先頭2B *pus_addr++ = uc_se_mode*0x100 + pDat->uc_infoL; //MPPE mode + MDPinfo *pus_addr++ = us_len*2; //データ長 memcpy(pus_addr, pDat->uc_hdr, d_Lcl_MEA_HK2B*2); pus_addr += d_Lcl_MEA_HK2B; //HDR of #1 memcpy(pus_addr, pDat->uc_hdr2, d_Lcl_MEA_IF2B*2); pus_addr += d_Lcl_MEA_IF2B; //INFe //app03_MIA_UINTtoUSHORT(ui_LEtO, pus_addr, 16); pus_addr += 16; //Et-OMN app04_ENA_Lin2Log(ui_LEtO, (unsigned char *) pus_addr, 4*16, 0, 0); pus_addr += 8; //memcpy(pus_addr, us_LEtP, 16*2); //Et-PAP app04_ENA_Lin2Log(ui_LEtP, (unsigned char *) pus_addr, 4*16, 1, 0); pCtrl->us_Llen_ttl += us_len; return (TRUE); } /* char app03_MEA_tlmout(unsigned char uc_nodeId, //MEA1 OR MEA2 フラグ unsigned short *pus_inbuf, //[INPUT] 圧縮前のプロダクト unsigned short *pus_outbuf, //[MID] 圧縮後バッファ unsigned char uc_lmhflg) //[INPUT] フラグ、0:L, 1: M, 4-9:H(DR-IDにそのまま使う) { unsigned char uc_cmp; unsigned short us_length, us_outsize, us_outsize1; int ii; unsigned char uc_drid, uc_pacId, uc_commentSize, uc_cmnt[8], uc_idx, uc_chall; unsigned int ui_TI; unsigned char uc_appID; unsigned char uc_info, uc_DataID; struct _s_MEA_Product *pDat; //プロダクト struct _s_MEA_CtrlParam *pCtrl; //制御用のフラグ及びパラメータ pDat = &Gst_MEA_dat; if (uc_nodeId == Gd_N_MEA1) pCtrl = &Gst_MEA1_ctrl;//MEA1 else pCtrl = &Gst_MEA2_ctrl;//MEA2 if (uc_nodeId == Gd_N_MEA1) { pCtrl = &Gst_MEA1_ctrl; uc_chall = d_Lcl_MEA1_2sM; } else { pCtrl = &Gst_MEA2_ctrl; uc_chall = d_Lcl_MEA2_2sM; } uc_appID = (uc_lmhflg <= 1) ? 3 : 5; uc_drid = (uc_lmhflg <= 1) ? uc_lmhflg+2 : uc_lmhflg; if (uc_lmhflg == 0) { us_length = pDat->us_Llen; ui_TI = pDat->ui_TIL; uc_info = pDat->uc_infoL; }//L mode else if (uc_lmhflg == 1) { us_length = pDat->us_Mlen; ui_TI = pDat->ui_TIL; uc_info = pDat->uc_infoM; }//M mode else { us_length = pDat->us_Hlen; ui_TI = pDat->ui_TIH; uc_info = 0; }//H mode //データ長が0の場合は何も作成しない if (us_length == 0) return FALSE; //Mmodeの4s-productは開始アドレスが異なる, Sci:2モードのみ Engモードは先頭から if (uc_lmhflg == 1 && !uc_chall && pDat->uc_hdr[4] == 2) pus_inbuf += d_Lcl_MEA_MD2B; uc_pacId = *(pus_inbuf + 7); //TI1 //データ部HDR ->プロダクト製作時に配置している //memcpy(pus_inbuf, uc_hdr, d_Lcl_MEA_HK2B*2); // if (pCtrl->uc_vet_cmp_ena) {//圧縮禁止 uc_cmp = 0; // non compress us_outsize = us_length*2;//バイト長入力なので、USワード長を2倍にする memcpy(pus_outbuf, pus_inbuf, us_outsize); } else { //RICE圧縮を行う uc_cmp = 3; // User defined pre-compression us_outsize = Rice_Compress(pus_inbuf, pus_outbuf, us_length*2, RICE_FMT_UINT16); } //コメント(H modeでは[2-3]の情報は意味を成さないが場合分けは省略した) if (uc_nodeId == Gd_N_MEA1) { //MEA1 uc_cmnt[0] = d_Lcl_MEA1_TLMID0;//TLMの識別ヘッダ uc_cmnt[1] = d_Lcl_MEA1_TLMID1; uc_DataID = 0; } else { //MEA2 uc_cmnt[0] = d_Lcl_MEA2_TLMID0;//TLMの識別ヘッダ uc_cmnt[1] = d_Lcl_MEA2_TLMID1; uc_DataID = 1; } uc_cmnt[2] = pCtrl->uc_snap_ave | (pCtrl->uc_eng_sci << 1 & 0x02) | (pCtrl->uc_mode << 2 & 0x3c); uc_cmnt[3] = (uc_lmhflg <= 1) ? uc_info : uc_DataID; //uc_info:プロダクト作成時に記入済 //HmodeではDataIDのみ uc_cmnt[4] = (us_length*2) >> 8 & 0xff; // 圧縮前データサイズ, 2Bのワード長なので2倍する。 uc_cmnt[5] = (us_length*2) & 0xff; uc_cmnt[6] = us_outsize >> 8 & 0xff; // 圧縮後データサイズ uc_cmnt[7] = us_outsize & 0xff; uc_commentSize = 8; uc_idx = 0; while(1) { if ( us_outsize > d_Lcl_MIA_TLMMAX) { us_outsize1 = d_Lcl_MIA_TLMMAX; us_outsize -= d_Lcl_MIA_TLMMAX; uc_cmnt[2] += 0x40; //分割Noを追記 } else { us_outsize1 = us_outsize; us_outsize = 0; if (uc_idx >= 1) uc_cmnt[2] += 0x40; //分割Noの最終を追記 } ii = app_PutTlm( uc_appID, // [INPUT] APP-NUM uc_nodeId, // [INPUT] Node-ID 0, // [INPUT] Data-ID uc_nodeId, // [INPUT] Header-ID (for PID-ID, CAT-ID setting) uc_drid, // [INPUT]**DR-ID (for CAT-ID) [0:HK 1:OS 2:L 3:M 4-9:H(0-5)] uc_cmp, // [INPUT] Comp mode [0:non 1:JPEG-rev 2:JPEG-nonrev 3:After-User-COMP // 4: User defined pre-compression] uc_pacId, // [INPUT]**Packet ID <<<< USER-DEF: 0x00- 0xFF >>>> ui_TI, // [INPUT]**Data TI <<<< USER-DEF: 0x00000000-0xFFFFFFFF >>>> uc_cmnt, // [INPUT] Comment <<<< USER-DEF: <128B >>>> uc_commentSize, // [INPUT] Comment - Size <<<< USER-DEF: <128B >>>> (unsigned char*) pus_outbuf +d_Lcl_MIA_TLMMAX*uc_idx, // [INPUT]**Data <<<< USER-DEF: <0x1E00 >>>> (int)us_outsize1); // [INPUT]**Data - Size <<<< USER-DEF: <0x1E00 >>>> if (us_outsize == 0) break; if (uc_idx++ >= d_Lcl_MIA_TLM_NM) break; } return TRUE; } */ // // Debug用 // /* char app03_MEA_tlmout(unsigned char uc_nodeId, //MEA1 OR MEA2 フラグ unsigned short *pus_inbuf, //[INPUT] 圧縮前のプロダクト unsigned short *pus_outbuf, //[MID] 圧縮後バッファ unsigned char uc_lmhflg) //[INPUT] フラグ、0:L, 1: M, 4-9:H(DR-IDにそのまま使う) { unsigned char uc_cmp; unsigned short us_length, us_outsize; int ii; unsigned char uc_drid, uc_pacId, uc_commentSize, uc_cmnt[8]; unsigned int ui_TI; unsigned char *uc_hdr; unsigned char uc_appID; struct _s_MEA_Product *pDat; //プロダクト struct _s_MEA_CtrlParam *pCtrl; //制御用のフラグ及びパラメータ pDat = &Gst_MEA_dat; if (uc_nodeId == Gd_N_MEA1) pCtrl = &Gst_MEA1_ctrl;//MEA1 else pCtrl = &Gst_MEA2_ctrl;//MEA2 uc_appID = 3; uc_drid = 2; us_length = 32*18; uc_hdr = pDat->uc_hdr; //データ長が0の場合は何も作成しない if (us_length == 0) return FALSE; //TLMパッケージ用のTIとパケットID ui_TI = 0xee; uc_pacId = 0xcc; //TI1 if (pCtrl->uc_vet_cmp_ena) {//圧縮禁止 uc_cmp = 0; // non compress us_outsize = us_length*2;//バイト長入力なので、USワード長を2倍にする memcpy(pus_outbuf, pus_inbuf, us_outsize); } else { //RICE圧縮を行う uc_cmp = 3; // User defined pre-compression us_outsize = Rice_Compress(pus_inbuf, pus_outbuf, us_length*2, RICE_FMT_UINT16); } if (uc_nodeId == Gd_N_MEA1) { //MEA1 uc_cmnt[0] = d_Lcl_MEA1_TLMID0;//TLMの識別ヘッダ uc_cmnt[1] = d_Lcl_MEA1_TLMID1; } else { //MEA2 uc_cmnt[0] = d_Lcl_MEA2_TLMID0;//TLMの識別ヘッダ uc_cmnt[1] = d_Lcl_MEA2_TLMID1; } uc_cmnt[2] = pCtrl->uc_snap_ave | (pCtrl->uc_eng_sci << 1 & 0x02) | (pCtrl->uc_mode << 2 & 0xfc); uc_cmnt[3] = 0; //pDat->uc_info; //プロダクト作成時に記入済 uc_cmnt[4] = (us_length*2) & 0xff; // 圧縮前データサイズ, 2Bのワード長なので2倍する。 uc_cmnt[5] = (us_length*2) >> 8 & 0xff; uc_cmnt[6] = us_outsize & 0xff; // 圧縮後データサイズ uc_cmnt[7] = us_outsize >> 8 & 0xff; uc_commentSize = 8; ii = app_PutTlm( uc_appID, // [INPUT] APP-NUM uc_nodeId, // [INPUT] Node-ID 0, // [INPUT] Data-ID uc_nodeId, // [INPUT] Header-ID (for PID-ID, CAT-ID setting) uc_drid, // [INPUT]**DR-ID (for CAT-ID) [0:HK 1:OS 2:L 3:M 4-9:H(0-5)] uc_cmp, // [INPUT] Comp mode [0:non 1:JPEG-rev 2:JPEG-nonrev 3:After-User-COMP // 4: User defined pre-compression] uc_pacId, // [INPUT]**Packet ID <<<< USER-DEF: 0x00- 0xFF >>>> ui_TI, // [INPUT]**Data TI <<<< USER-DEF: 0x00000000-0xFFFFFFFF >>>> uc_cmnt, // [INPUT] Comment <<<< USER-DEF: <128B >>>> uc_commentSize, // [INPUT] Comment - Size <<<< USER-DEF: <128B >>>> (unsigned char*) pus_outbuf, // [INPUT]**Data <<<< USER-DEF: <0x1E00 >>>> (int)us_outsize); // [INPUT]**Data - Size <<<< USER-DEF: <0x1E00 >>>> return TRUE; } */ //M2 data USE 0-7ch of [16sc][16ch][32en] in L&M&H(4s) modes // 3D-LL(600s) [88dir][16en] uc_f = 0 L 0-7ch // 3D-M(4 or 8s) [88dir][16en] uc_f = 0 M 0-7ch // 3D-H(2s & 4s) [88dir][32en] uc_f = 2 H 0-7ch // uc_f = 3 H 8-15ch char app03_MEA_3D( unsigned short *pus_inbuf, //[INPUT] [16sc]( 12B + [16ch][32en]) unsigned short *pus_outbuf, //[OUTPUT][88dir][16or32en] unsigned char uc_f) //[INPUT] Data ID { int i, j, k, k2; int i_eSize, i_ch_os, i_sc, i_hd; i_ch_os = (uc_f != 3) ? 0 : 8; //8 for 2nd product of 3D-H(2s) i_eSize = (uc_f <= 1) ? 16 : 32; //Number of energy step i_sc = d_Lcl_MEA_PACSZ/2; //Size of sector(packet) at USHORT i_hd = d_Lcl_MEA_HDRSZ/2; //Size of header in packet pus_inbuf += i_hd; if (uc_f <= 1) { //ADD in L&M modes for (k = 0; k < 32; ++k) { //energy step k2 = (uc_f <= 1) ? k/2 : k; i = 0; for (j = 0; j < 4; ++j) *(pus_outbuf + k2 + j*i_eSize) += *(pus_inbuf + i+i_ch_os + k*16 + (4*j+2)*i_sc) + *(pus_inbuf + i+i_ch_os + k*16 + (4*j+3)*i_sc); i = 1; for (j = 0; j < 8; ++j) *(pus_outbuf + k2 + (j+4)*i_eSize) += *(pus_inbuf + i+i_ch_os + k*16 + 2*j *i_sc) + *(pus_inbuf + i+i_ch_os + k*16 + (2*j+1)*i_sc); for (i = 2; i <= 5; ++i) //channel for (j = 0; j < 16; ++j) //sector(sweep) *(pus_outbuf + k2 + (j+12 + (i-2)*16)*i_eSize) += *(pus_inbuf + i+i_ch_os + k*16 + j*i_sc); i = 6; for (j = 0; j < 8; ++j) *(pus_outbuf + k2 + (j+76)*i_eSize) += *(pus_inbuf + i+i_ch_os + k*16 + 2*j *i_sc) + *(pus_inbuf + i+i_ch_os + k*16 + (2*j+1)*i_sc); i = 7; for (j = 0; j < 4; ++j) *(pus_outbuf + k2 + (j+84)*i_eSize) += *(pus_inbuf + i+i_ch_os + k*16 + (4*j+2)*i_sc) + *(pus_inbuf + i+i_ch_os + k*16 + (4*j+3)*i_sc); } } else { //INSERT in H mode for (k = 0; k < 32; ++k) { //energy step i = 0; for (j = 0; j < 4; ++j) *(pus_outbuf + k + j*i_eSize) = *(pus_inbuf + i+i_ch_os + k*16 + (4*j+2)*i_sc) + *(pus_inbuf + i+i_ch_os + k*16 + (4*j+3)*i_sc); i = 1; for (j = 0; j < 8; ++j) *(pus_outbuf + k + (j+4)*i_eSize) = *(pus_inbuf + i+i_ch_os + k*16 + 2*j *i_sc) + *(pus_inbuf + i+i_ch_os + k*16 + (2*j+1)*i_sc); for (i = 2; i <= 5; ++i) //channel for (j = 0; j < 16; ++j) //sector(sweep) *(pus_outbuf + k + (j+12 + (i-2)*16)*i_eSize) = *(pus_inbuf + i+i_ch_os + k*16 + j*i_sc); i = 6; for (j = 0; j < 8; ++j) *(pus_outbuf + k + (j+76)*i_eSize) = *(pus_inbuf + i+i_ch_os + k*16 + 2*j *i_sc) + *(pus_inbuf + i+i_ch_os + k*16 + (2*j+1)*i_sc); i = 7; for (j = 0; j < 4; ++j) *(pus_outbuf + k + (j+84)*i_eSize) = *(pus_inbuf + i+i_ch_os + k*16 + (4*j+2)*i_sc) + *(pus_inbuf + i+i_ch_os + k*16 + (4*j+3)*i_sc); } } return TRUE; }