//2014.01.16 /******************************************************************************* * モジュール名称 :APP03 Mission TLM (L&M) PI tasks * * モジュールラベル :app03_PIs * * タスク区分 :Application-03 MIA task for Mission TLM (L&M) * * 機能 : * * コーリングシーケンス:void app03_(PI) * * 引数 :なし * * 戻り値 :なし * * 使用上の注意 :グローバル変数はアプリケーション01でまとめて初期化 * * エラー処理 :なし * * 注意 : EDIT権限は、MPPE/MIA組 * * 作成日・作成者 :2012/11/25 Y.K. * *******************************************************************************/ //#include "dpu_api.h" //#include "dpu_api_proto.h" #include "app_common.h" #include "app_MPPE-MIA.h" #include "app_comp_rice.h" //########## デバッグ用 ########## #ifdef _RUN_ON_WINDOWS_ #include "mylib.h" #endif int app03_MIA_GetVelcity(int, int); char app03_MIA_CalcVM(int, int, int, int, int*, int, int, unsigned short*, double*); void app03_MIA( unsigned int ui_sunpulseCnt ) { int i, j; int i_flag; // // === 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) unsigned char uc_modeNo, uc_segNo, uc_segNoEnd; unsigned char uc_find_pac0; unsigned char *puc_dat; unsigned short *pus_dat; //DEBUG #ifdef _GET_WORKING_TIME_MIA__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 struct _s_MIA_CtrlParam *pCtrl; //制御用のフラグ及びパラメータ pCtrl = &Gst_MIA_ctrl; uc_find_pac0 = FALSE; //先頭検出フラグの初期化 uc_modeNo=0; uc_segNo =0; uc_segNoEnd =0; puc_dat = G03uc_data + 4; pus_dat = (unsigned short*)puc_dat; // このまま3D-LLに使うためTIを空ける // ----------------------------------------------------------- // -- Set at the buffer with the oldest non-processed block -- // ----------------------------------------------------------- i_bufId = app_CheckNonProcBlock ( Gd_N_MIA, 0, // [INPUT] Node/Data ID Gui_TLMm_blockTime[Gd_N_MIA], // [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; // === No data === // ------------------------------------------- // -- Set at the oldest non-processed block -- // ------------------------------------------- // Newest Block i_numNewBlock = app_SetNonProcBlock(Gd_N_MIA, 0, // [INPUT] Node/Data ID i_bufId, // [INPUT] Buffer ID Gui_TLMm_blockTime[Gd_N_MIA], // [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[Gd_N_MIA] = ui_timeData; // === shift to newest data for SKIP === return; } if ( i_numNewBlock > 3) i_numNewBlock = 3; //1パケット(12+5260+1+7 = 5280B) //1ブロック(5280 x 25 = 132000B) // --------------------- // -- Read Block data -- // --------------------- for (i=0; i Gui_TLMm_blockTime[Gd_N_MIA] && // NEW data t_blockInfo.i_replyNum > 0 && // Data available t_blockInfo.c_invalidFlg == 0 ) { // Data correct //1BLOCK中に先頭パケットの位置は不定 //1SPIN分のデータが2BLOCKに跨る場合がある // for (j = 0; j < 25; ++j) { //先にMISSIONヘッダのみ読み込み、ダミーパケットの場合はスキップ i_flag = app_GetPacket( 3, // [INPUT] App-No:3 Gd_N_MIA, 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_segNo = G03uc_packet[d_Lcl_MIA_SGN_ADRR];//セグメント番号がダミーを示した場合はスキップ if (uc_segNo == 0xff || uc_segNo > 0x0f) continue; //パケット全てを読み込み i_flag = app_GetPacket( 3, // [INPUT] App-No:3 Gd_N_MIA, 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_MIA_PAC_SIZE, // [INPUT] 読出データ数: G03uc_packet); // [OUTPUT] 1 Packet Data - copied if ( i_flag ) continue; //頭出し if (uc_segNo == 0) { uc_find_pac0 = TRUE; //観測モードに応じてセグメント番号の末尾を定義 uc_modeNo = (G03uc_packet[d_Lcl_MIA_MOD_ADRR] >> 4) & 0x0f; if (uc_modeNo == 0) uc_segNoEnd = 0x0b; else if (uc_modeNo == 1) uc_segNoEnd = 0x0f; else if (uc_modeNo == 2) uc_segNoEnd = 0x0f; else uc_segNoEnd = 0; //FOR DEBUG //無理やりモード番号を定義, SWcalと併用 //uc_modeNo = 2; //G03uc_packet[d_Lcl_MIA_MOD_ADRR] |= (uc_modeNo << 4) & 0xf0; //SICヘッダの読み込み app03_MIA_readHDRPacket(G03uc_packet, //[INPUT] Raw Packet data FALSE); //[INPUT] H mode FLAG } //頭出し以後 //ScienceDataをuc_dataに再配置する if (uc_find_pac0 && uc_segNo <= uc_segNoEnd) { //カウントデータの読み込み app03_MIA_readSCIPacket(G03uc_packet, //[INPUT] Raw Packet data puc_dat ); //[OUTPUT]Count data 1スピン分取得後ループを抜ける // // Debug用、各パケットの先頭32Bだけ抜粋 // //memcpy(G03uc_data + 32*uc_segNo, G03uc_packet + 12, 32); //memcpy(G03uc_data + 32*j, G03uc_packet + 12, 32); } //お尻出し if (uc_find_pac0 && uc_segNo == uc_segNoEnd) { uc_find_pac0 = FALSE; if (pCtrl->uc_swcal_prm[0]) { //SW cal ON時: テスト用パルスでカウントデータを上書きする app03_MIA_makeSWcal(pus_dat, //[OUTPUT] Buffer for Count data uc_modeNo); //[INPUT] モード番号 } //EMUのTIを上書き #ifdef _RUN_WITH_EMU_MIA__ Gst_MIA_dat.ui_TIL = t_blockInfo.ui_createTime; #endif //プロダクトの作成 //Lプロダクト app03_MIA_makeL( ui_sunpulseCnt, // [INPUT] サンパルス pus_dat, // [INPUT] カウントデータ Gst_MIA_dat.us_Ldata, // [OUTPUT] プロダクト用バッファ (unsigned short*)G03uc_packet); // [MID] 圧縮後のバッファ // app03_MIA_tlmout( Gus_MPPE_Ldata, // [INPUT]プロダクト // (unsigned short*)G03uc_packet, // [MID] 圧縮後のバッファ // 0); //[INPUT]L-mode data flag //Mプロダクト app03_MIA_makeM( ui_sunpulseCnt, // [INPUT] サンパルス pus_dat, // [INPUT] カウントデータ Gst_MIA_dat.us_3DL2, // [OUTPUT] プロダクト一式 pus_dat); // [MID] 圧縮後のバッファ // app03_MIA_tlmout2((unsigned short*)G03uc_data, // [INPUT]プロダクト // (unsigned short*)G03uc_packet, // [MID] 圧縮後のバッファ // 0); } } //ブロックTIを更新する if (uc_find_pac0 && i_numNewBlock - i > 1) //1spin分データが揃わないがBlockが残っている場合 Gui_TLMm_blockTime[Gd_N_MIA] = t_blockInfo.ui_createTime;//次スピン時はこのTI直後のブロックから else if (!uc_find_pac0) //1spin分データが揃った状態でBlock終了 Gui_TLMm_blockTime[Gd_N_MIA] = t_blockInfo.ui_createTime;//次スピン時はこのTI直後のブロックから else if (uc_segNo == 0xff) //最後のパケットがダミーパケット Gui_TLMm_blockTime[Gd_N_MIA] = t_blockInfo.ui_createTime;//次スピン時はこのTI直後のブロックから } //ブロック数が1で頭有、お尻無し --> !!!バッファ切り替えの可能性!!! if (uc_find_pac0 && i_numNewBlock == 1) { i_bufId2 = app_CheckNonProcBlock ( Gd_N_MIA, 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[Gd_N_MIA] = t_blockInfo.ui_createTime;//次スピン時はこのTI直後のブロックから // Newest Block-- Set at the oldest non-processed block -- i_numNewBlock2 = app_SetNonProcBlock(Gd_N_MIA, 0, // [INPUT] Node/Data ID i_bufId2, // [INPUT] Buffer ID Gui_TLMm_blockTime[Gd_N_MIA], // [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; } } } // To next block i_flag = app_NextBlock( Gd_N_MIA, 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_MIA__03 dpu_getTime( &t_timeInfo); ui_tmp2 = t_timeInfo.ui_currentTime2; ui_tmp3 = ui_tmp2 - ui_tmp1; pCtrl->ui_eng_vmf = ui_tmp3; #endif } char app03_MIA_readHDRPacket(unsigned char *puc_inbuf, // [INPUT] Raw Packet data unsigned char uc_Hmode) //[INPUT] H mode FLAG // (return) TRUE { int i_cntr; // サイエンスデータカウンタ unsigned int ui_ti0, ui_ti1; struct _s_MIA_Product *pDat; //プロダクト struct _s_MIA_CtrlParam *pCtrl; //制御用のフラグ及びパラメータ unsigned char *puc_hdr; unsigned int *pui_TI; pDat = &Gst_MIA_dat; pCtrl = &Gst_MIA_ctrl; if (uc_Hmode) { puc_hdr = pDat->uc_hdrH; pui_TI = &pDat->ui_TIH; } else { puc_hdr = pDat->uc_hdrL; pui_TI = &pDat->ui_TIL; } //TI memcpy(&ui_ti0, puc_inbuf + d_Lcl_MIA_RMP_SIZE, 4); //MISSIONヘッダから ui_ti1 = ( (unsigned int) *(puc_inbuf + d_Lcl_MIA_RMP_SIZE +4) << 8) + ( (unsigned int) *(puc_inbuf + d_Lcl_MIA_RMP_SIZE +5) ); //*pui_TI = (!pCtrl->uc_watchman) ? ui_ti0 + ui_ti1 : ui_pcTI; *pui_TI = ui_ti0 + ui_ti1; //SCIヘッダ取得 memcpy(puc_hdr, puc_inbuf + d_Lcl_MIA_SCI_ADRR, d_Lcl_MIA_SCI_SIZE); //APP03ではENG用データの蓄積 if (!uc_Hmode) { //HV info(256スピン分をメモリに保持する) i_cntr = *(puc_inbuf + d_Lcl_MIA_CNT_ADRR); //サイエンスデータカウンタ memcpy(pDat->uc_HVinf + d_Lcl_MIA_HVB_SIZE*i_cntr, puc_inbuf + d_Lcl_MIA_HVB_ADRR, d_Lcl_MIA_HVB_SIZE); //ASICのデータ if (pDat->uc_ASIC_idx == 0 && *(puc_inbuf + d_Lcl_MIA_ASC_ADRR) == 0xff //頭出し && *(puc_inbuf + d_Lcl_MIA_ASC_ADRR +1) == 0x00 && *(puc_inbuf + d_Lcl_MIA_ASC_ADRR +2) == 0x55 && *(puc_inbuf + d_Lcl_MIA_ASC_ADRR +3) == 0xaa) pDat->uc_ASIC_idx = 1; else if (pDat->uc_ASIC_idx >= 1) { memcpy(pDat->uc_ASICinf + d_Lcl_MIA_ASC_SIZE*(pDat->uc_ASIC_idx++ - 1), puc_inbuf + d_Lcl_MIA_ASC_ADRR, d_Lcl_MIA_ASC_SIZE); } if (pDat->uc_ASIC_idx == d_Lcl_MIA_ASC_SPNN)//INDEXのリセット pDat->uc_ASIC_idx = 0; } return TRUE; } //G03uc_data[0xd000] 53248B/(32en x 2B) = 832 cell にカウントデータを集める //M1 [768cell][32en] --> [16sc][16+1][32en](SW) + [16sc][8+1ch][32en](Anti) //M2 [32sc][32+2ch][32en] (1088 cell) --> [32sc][16+1ch][32en](Anti) //M3 [16sc][16+2][32en] (288 cell) --> [16sc][8+1][32en](Anti) + [16sc][8ch][32en](SW) char app03_MIA_readSCIPacket(unsigned char *puc_inbuf, // [INPUT] Raw Packet data unsigned char *puc_outbuf) // [OUTPUT] カウントデータのみ取り出す // (return) TRUE { int i, j, k; int i_SegmentNum; // セグメント番号 in ミッションヘッダ int i_modeNo; //モード番号 struct _s_MIA_Product *pDat; //プロダクト unsigned short *pus_cnt0, *pus_cnt1, *pus_cnt2, *pus_cnt3, *pus_cnt4; pDat = &Gst_MIA_dat; i_modeNo = pDat->uc_hdrL[8] >> 4 & 0x0f; //(0-2) データモード i_SegmentNum = *(puc_inbuf + d_Lcl_MIA_SGN_ADRR); if (i_modeNo == 0) { if (i_SegmentNum == 0) {//4sc x 18ch x 32en puc_inbuf += d_Lcl_MIA_SP0_ADRR; pus_cnt0 = (unsigned short*) (puc_outbuf + d_Lcl_MIA_SW1_ADRR);//Anti-SW for (j = 0; j < 4; ++j) { //SC0, SC1 for (k = 0; k < 32; ++k) { for (i = 0; i <= 3; ++i) memcpy(pus_cnt0 + 9*32*j + 32*i + k, puc_inbuf + (j*32*18 + k*18 + i)*2, 2); memcpy(pus_cnt0 + 9*32*j + 32*8 + k, puc_inbuf + (j*32*18 + k*18 + 4)*2, 2); for (i = 6; i <= 9; ++i) memcpy(pus_cnt0 + 9*32*j + 32*(i-2) + k, puc_inbuf + (j*32*18 + k*18 + i)*2, 2); } } //##### 2cell -> 1cell ###### pus_cnt0 = (unsigned short*)(puc_outbuf + d_Lcl_MIA_SW1_ADRR); ////Anti-SW from SC0 pus_cnt1 = pus_cnt0 + 9*32*1; for (i = 0; i < 9*32; ++i) *pus_cnt0++ += *pus_cnt1++; //SC 0 pus_cnt1 = pus_cnt0 + 9*32*1; pus_cnt2 = pus_cnt0 + 9*32*2; for (i = 0; i < 9*32; ++i) *pus_cnt0++ = *pus_cnt1++ + *pus_cnt2++; //SC 1 } else if (i_SegmentNum <= 8) { puc_inbuf += d_Lcl_MIA_SP1_ADRR; pus_cnt0 = (unsigned short*) (puc_outbuf) + 17*32*2*(i_SegmentNum - 1);//SW 16x16+1 from SC(i_SegmentNum - 1)x2 for (j = 0; j < 2; ++j) { for (k = 0; k < 32; ++k) { for (i = 12; i < 12+16; ++i) memcpy(pus_cnt0 + 17*32*j + 32*(i-12) + k, puc_inbuf + (j*32*30 + k*30 + i)*2, 2); memcpy(pus_cnt0 + 17*32*j + 32*16 + k, puc_inbuf + (j*32*30 + k*30 + 4)*2, 2); } } pus_cnt0 = (unsigned short*) (puc_outbuf + d_Lcl_MIA_SW1_ADRR) + 9*32*2*i_SegmentNum;//Anti-SW from SC2,4, .., 16 for (j = 0; j < 2; ++j) { //SC0, SC1 for (k = 0; k < 32; ++k) { for (i = 0; i <= 3; ++i) memcpy(pus_cnt0 + 9*32*j + 32*i + k, puc_inbuf + (j*32*30 + k*30 + i)*2, 2); memcpy(pus_cnt0 + 9*32*j + 32*8 + k, puc_inbuf + (j*32*30 + k*30 + 4)*2, 2); for (i = 6; i <= 9; ++i) memcpy(pus_cnt0 + 9*32*j + 32*(i-2) + k, puc_inbuf + (j*32*30 + k*30 + i)*2, 2); } } //##### 4cell -> 1cell ###### if (i_SegmentNum == 8) { pus_cnt0 = (unsigned short*)(puc_outbuf + d_Lcl_MIA_SW1_ADRR) + 9*32*2; ////Anti-SW from SC2 pus_cnt1 = pus_cnt0 + 9*32*1; pus_cnt2 = pus_cnt0 + 9*32*2; pus_cnt3 = pus_cnt0 + 9*32*3; for (i = 0; i < 9*32; ++i) *pus_cnt0++ += *pus_cnt1++ + *pus_cnt2++ + *pus_cnt3++; //SC 2 pus_cnt1 = pus_cnt0 + 9*32*3; pus_cnt2 = pus_cnt0 + 9*32*4; pus_cnt3 = pus_cnt0 + 9*32*5; pus_cnt4 = pus_cnt0 + 9*32*6; for (i = 0; i < 9*32; ++i) *pus_cnt0++ = *pus_cnt1++ + *pus_cnt2++ + *pus_cnt3++ + *pus_cnt4++;//SC 3 pus_cnt1 = pus_cnt0 + 9*32*6; pus_cnt2 = pus_cnt0 + 9*32*7; pus_cnt3 = pus_cnt0 + 9*32*8; pus_cnt4 = pus_cnt0 + 9*32*9; for (i = 0; i < 9*32; ++i) *pus_cnt0++ = *pus_cnt1++ + *pus_cnt2++ + *pus_cnt3++ + *pus_cnt4++;//SC 4 pus_cnt1 = pus_cnt0 + 9*32*9; pus_cnt2 = pus_cnt0 + 9*32*10; pus_cnt3 = pus_cnt0 + 9*32*11; pus_cnt4 = pus_cnt0 + 9*32*12; for (i = 0; i < 9*32; ++i) *pus_cnt0++ = *pus_cnt1++ + *pus_cnt2++ + *pus_cnt3++ + *pus_cnt4++;//SC 5 } } else if (i_SegmentNum == 9) { puc_inbuf += d_Lcl_MIA_SP1_ADRR; pus_cnt0 = (unsigned short*) (puc_outbuf + d_Lcl_MIA_SW1_ADRR) + 9*32*6;//Anti-SW from SC6 for (j = 0; j < 4; ++j) { //SC6, SC7 for (k = 0; k < 32; ++k) { for (i = 0; i <= 3; ++i) memcpy(pus_cnt0 + 9*32*j + 32*i + k, puc_inbuf + (j*32*18 + k*18 + i)*2, 2); memcpy(pus_cnt0 + 9*32*j + 32*8 + k, puc_inbuf + (j*32*18 + k*18 + 4)*2, 2); for (i = 6; i <= 9; ++i) memcpy(pus_cnt0 + 9*32*j + 32*(i-2) + k, puc_inbuf + (j*32*18 + k*18 + i)*2, 2); } } //##### 2cell -> 1cell ###### pus_cnt0 = (unsigned short*)(puc_outbuf + d_Lcl_MIA_SW1_ADRR) + 9*32*6; //Anti-SW from SC6 pus_cnt1 = pus_cnt0 + 9*32*1; for (i = 0; i < 9*32; ++i) *pus_cnt0++ += *pus_cnt1++; //SC 6 pus_cnt1 = pus_cnt0 + 9*32*1; pus_cnt2 = pus_cnt0 + 9*32*2; for (i = 0; i < 9*32; ++i) *pus_cnt0++ = *pus_cnt1++ + *pus_cnt2++; //SC 7 } else if (i_SegmentNum <= 11) { puc_inbuf += d_Lcl_MIA_SP1_ADRR; pus_cnt0 = (unsigned short*) (puc_outbuf + d_Lcl_MIA_SW1_ADRR) + 9*32*(8 + (i_SegmentNum-10)*4);//Anti-SW from SC8 or SC12 for (j = 0; j < 4; ++j) { //SC8-11 or SC12-15 for (k = 0; k < 32; ++k) { for (i = 0; i <= 3; ++i) memcpy(pus_cnt0 + 9*32*j +32*i +k, puc_inbuf + (j*32*18 +k*18 +i)*2, 2); memcpy(pus_cnt0 + 9*32*j +32*8 +k, puc_inbuf + (j*32*18 +k*18 +4)*2, 2); for (i = 6; i <= 9; ++i) memcpy(pus_cnt0 + 9*32*j +32*(i-2) +k, puc_inbuf + (j*32*18 +k*18 +i)*2, 2); } } } else { return FALSE; } } else if (i_modeNo == 1) { //M2 32sc x (32ch + 2ch) = 1088 cell のうち17ch分を配置する if (i_SegmentNum <= 15) { if (!i_SegmentNum) puc_inbuf += d_Lcl_MIA_SP0_ADRR; else puc_inbuf += d_Lcl_MIA_SP1_ADRR; pus_cnt0 = (unsigned short*) (puc_outbuf) + 2*17*32*i_SegmentNum;//MG1 from SC(2 x Seg#) for (j = 0; j < 2; ++j) { for (k = 0; k < 32; ++k) { for (i = 0; i <= 7; ++i) memcpy(pus_cnt0 + 17*32*j +32*i +k, puc_inbuf + (j*32*34 +k*34 +i)*2, 2); memcpy(pus_cnt0 + 17*32*j +32*16 +k, puc_inbuf + (j*32*34 +k*34 +8)*2, 2); for (i = 10; i <= 17; ++i) memcpy(pus_cnt0 + 17*32*j +32*(i-2) +k, puc_inbuf + (j*32*34 +k*34 +i)*2, 2); } } } else { return FALSE; } } else if (i_modeNo == 2) { //M3 16sc x (16ch + 2ch) = 288 cell のうち16+1ch/272cellを配置する // 16sc x 8+1ch x 32en + 16sc x 8ch x 32en(for Hmode) if (i_SegmentNum <= 15) { if (!i_SegmentNum) puc_inbuf += d_Lcl_MIA_SP0_ADRR; else puc_inbuf += d_Lcl_MIA_SP1_ADRR; pus_cnt0 = (unsigned short*) (puc_outbuf) + 9*32*i_SegmentNum; //MG2 from SC(Seg#) for (k = 0; k < 32; ++k) { for (i = 0; i <= 3; ++i) memcpy(pus_cnt0 + 32*i + k, puc_inbuf + (k*18 + i)*2, 2); memcpy(pus_cnt0 + 32*8 + k, puc_inbuf + (k*18 + 4)*2, 2); for (i = 6; i <= 9; ++i) memcpy(pus_cnt0 + 32*(i-2) + k, puc_inbuf + (k*18 + i)*2, 2); } pus_cnt0 = (unsigned short*) (puc_outbuf + d_Lcl_MIA_MG3_ADRR) + 8*32*i_SegmentNum; //SW channel from SC(Seg#) for (k = 0; k < 32; ++k) for (i = 10; i < 18; ++i) memcpy(pus_cnt0 + 32*(i-10) + k, puc_inbuf + (k*18 + i)*2, 2); } else { return FALSE; } } else if (i_modeNo == 3) {//Memorydump return FALSE; } else { return FALSE; } return TRUE; } void app03_MIA_makeSWcal(unsigned short us_pac[], // [OUTPUT] カウンタデータ unsigned char uc_modeNo) // [INPUT] モード番号 // (return) { int i, j, k; int i_ch_num[2], i_sc_num; int i_addr; struct _s_MIA_CtrlParam *pCtrl; //制御用のフラグ及びパラメータ pCtrl = &Gst_MIA_ctrl; //カウンタデータ //M1 [16sc][16+1][32en](SW) + [16sc][8+1ch][32en](Anti) //M3 [16sc][8+1][32en](Anti) + [16sc][8ch][32en](SW for Hmode) //M2 [32sc][16+1ch][32en] if (uc_modeNo == 0) { i_sc_num = 16; i_ch_num[0] = 17; i_ch_num[1] = 9; i_addr = d_Lcl_MIA_SW1_ADRR/2; } else if (uc_modeNo == 2) { i_sc_num = 16; i_ch_num[0] = 9; i_ch_num[1] = 8; i_addr = d_Lcl_MIA_MG3_ADRR/2; } else { i_sc_num = 32; i_ch_num[0] = 17; i_ch_num[1] = 0; i_addr = 0; } for (j = 0; j < i_sc_num; j++) { for (i = 0; i < i_ch_num[0]; ++i) { for ( k = 0; k < 32; ++k) { 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[k + 32*i + 32*i_ch_num[0]*j] = k; else us_pac[k + 32*i + 32*i_ch_num[0]*j] = pCtrl->uc_swcal_prm[4]; } else us_pac[k + 32*i + 32*i_ch_num[0]*j] = 0; }}} if (uc_modeNo == 0 || uc_modeNo == 2) { for (j = 0; j < i_sc_num; j++) { for (i = 0; i < i_ch_num[1]; ++i) { for ( k = 0; k < 32; ++k) { 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[k + 32*i + 32*i_ch_num[1]*j + i_addr] = k; else us_pac[k + 32*i + 32*i_ch_num[1]*j + i_addr] = pCtrl->uc_swcal_prm[4]; } else us_pac[k + 32*i + 32*i_ch_num[1]*j + i_addr] = 0; }}} } return; } //Lプロダクトは、MIAのデータモードから一意に決定する //Guc_MIA_eng_sci: SCI/ENG = 0/1 //Guc_MIA_mode: Lプロダクトでは参照する必要がない //Guc_MIA_snapshot_ave; //1:Snapshot, 0:Average char app03_MIA_makeL(unsigned int ui_sunpulseCnt, // [INPUT] Sun Pulse unsigned short *pus_inbuf, // [INPUT] COUNT data unsigned short *pus_outbuf, // [OUTPUT] Product unsigned short *pus_midbuf) // [MID] buffer for comp { int i, j, k, n; unsigned short *pus_SWCnt, *pus_ALLCnt; unsigned int *pui_cnt0; unsigned short *pus_cnt1; int i_modeNo, i_hvram[8], i_spinNo; int i_dir; double f_VM[10]; unsigned int ui_sp_sync; unsigned char uc_info = 0; unsigned short us_len = 0; unsigned short *pus_outb_cur, *pus_outb_cur0; unsigned char uc_se_mode, uc_Lflg; struct _s_MIA_Product *pDat; //プロダクト struct _s_MIA_CtrlParam *pCtrl; //制御用のフラグ及びパラメータ pDat = &Gst_MIA_dat; pCtrl = &Gst_MIA_ctrl; uc_Lflg = 0; uc_se_mode = pCtrl->uc_snap_ave + pCtrl->uc_eng_sci*2 + (pCtrl->uc_mode << 2 & 0x3c);//SCI/ENG モード //上位ビットから読む i_modeNo = (pDat->uc_hdrL[8] >> 4) & 0x0f; //(0-2) データモード i_spinNo = pDat->uc_hdrL[8] & 0x0f; //(0-3) スピンカウンタ:エネルギーテーブル対応に使用 //CHECK if (i_modeNo > 2) i_modeNo = 0; //return (FALSE); if (i_spinNo > 3) i_spinNo = 0; for (n = 0; n < 4; ++n) { //RAM番号 i_hvram[2*n] = (pDat->uc_hdrL[n + 12] >> 4) & 0x0f; i_hvram[2*n +1] = pDat->uc_hdrL[n + 12] & 0x0f; } for (n = 0; n < 8; ++n) if (i_hvram[n] > 5) i_hvram[n] = 5; //スピンカウンタの管理 スピン番号に同期を取る if (i_spinNo == 0 && pDat->us_SPIN_N == 0xffff) pDat->us_SPIN_N = 0; else if (pDat->us_SPIN_N != 0xffff) pDat->us_SPIN_N++; else return FALSE; //同期が取れたらプロダクト作成開始 //マルチスピンデータ用のカウンタ ui_sp_sync = pDat->uc_hdrL[6]; //データ同期カウンタ //ui_sp_sync = ui_sunpulseCnt; //MDPから供給のカウンタ #ifdef _RUN_WITH_EMU_MIA__ ui_sp_sync = pDat->us_SPIN_N; //SW独自カウンタで上書き #endif pus_outb_cur0 = pus_outb_cur = pus_outbuf + pDat->us_Llen_ttl; //Lmode product memcpy(pus_outb_cur + 2, pDat->uc_hdrL, d_Lcl_MIA_HK2B*2); pus_outb_cur += 2 + d_Lcl_MIA_HK2B; //HK pus_ALLCnt = pus_inbuf; //FOR M2 and M3 if (pCtrl->uc_eng_sci == 0) {//サイエンス //分析器のデータモード if (i_modeNo == 0) { //M1 太陽風 //RAW: [16sc][16+1ch][32en] & [16sc[8+1ch][32en] //プロダクト: VM(4s)[SW, All], VM(16s)[SW], Et(32s)[4dir+SW], 3D-LL(3600s)[SW] pus_SWCnt = pus_inbuf; //[16sc][16+1ch][32en] pus_ALLCnt = pus_inbuf + d_Lcl_MIA_SW1_ADRR/2; //[16sc][8+1ch][32en] //VM(4s) SW for (n = 0; n < 10; ++n) f_VM[n] = 0.; //初期化 app03_MIA_CalcVM(8, //[INPUT] HVramの中のセクター数:SW中なので8 16, //[INPUT] カウントデータのsector数 16, //[INPUT] カウントデータのchannel数 32, //[INPUT] カウントデータのenergy数 i_hvram, //[INPUT] HVram [8] i_spinNo, //[INPUT] SPIN NUMBER 0-3 0, //[INPUT] VMの種類 VMsw-M1(0); VMal-M1(1); VM-M2(2); VM-M3(1) pus_SWCnt, //[INPUT] カウントデータ(先頭アドレス) f_VM); //[OUTPUT] Velocity moment app03_MIA_DBLtoUSHORT(f_VM, pus_outb_cur, 10); pus_outb_cur += 10; //TLM用パケットに配置 #ifdef _RUN_ON_WINDOWS_ printf("VMsw(4s): "); for (n = 0; n < 10; ++n) printf("%.3e ", f_VM[n]); printf("\n"); printf("VMsw(4s): nV/n"); for (n = 1; n <=3 ; ++n) printf("%.3e ", f_VM[n]/f_VM[0]*0xffff); printf("| %.3e ", app_math_sqrt((f_VM[1]*f_VM[1]+f_VM[2]*f_VM[2]+f_VM[3]*f_VM[3]))/f_VM[0]*0xffff); printf("\n"); #endif //VM(4s) ALL for (n = 0; n < 10; ++n) f_VM[n] = 0.; //初期化 app03_MIA_CalcVM(2, //[INPUT] HVramの中のセクター数 16, //[INPUT] カウントデータのsector数 8, //[INPUT] カウントデータのchannel数 32, //[INPUT] カウントデータのenergy数 i_hvram, //[INPUT] HVram [8] i_spinNo, //[INPUT] SPIN NUMBER 0-3 1, //[INPUT] VMの種類 VMsw-M1(0); VMal-M1(1); VM-M2(2); VM-M3(1) pus_ALLCnt, //[INPUT] カウントデータ(先頭アドレス) f_VM); //[OUTPUT] Velocity moment app03_MIA_DBLtoUSHORT(f_VM, pus_outb_cur, 10); pus_outb_cur += 10; //TLM用パケットに配置 #ifdef _RUN_ON_WINDOWS_ VMcal( 2, //[INPUT] HVramの中のセクター数 16, //[INPUT] カウントデータのsector数 8, //[INPUT] カウントデータのchannel数 32, //[INPUT] カウントデータのenergy数 i_hvram, //[INPUT] HVram [8] i_spinNo, //[INPUT] SPIN NUMBER 0-3 1, //[INPUT] VMの種類 VMsw-M1(0); VMal-M1(1); VM-M2(2); VM-M3(1) pus_ALLCnt, //[INPUT] カウントデータ(先頭アドレス) my_double); //[OUTPUT] Velocity moment printf("VMal(4s):@DBL "); for (n = 0; n < 10; ++n) printf("%.3e ", my_double[n]); printf("\n"); printf("VMal(4s): "); for (n = 0; n < 10; ++n) printf("%.3e ", f_VM[n]); printf("\n"); printf("VMal(4s): nV/n"); for (n = 1; n <=3 ; ++n) printf("%.3e ", f_VM[n]/f_VM[0]*0xffff); printf("| %.3e ", app_math_sqrt((f_VM[1]*f_VM[1]+f_VM[2]*f_VM[2]+f_VM[3]*f_VM[3]))/f_VM[0]*0xffff); printf("\n"); app03_MIA_DBLtoUSHORT(f_VM, my_ushort, 10); printf("VMal(4s): "); for (n = 0; n < 10; ++n) printf("%04x ", my_ushort[n]); printf("\n"); USHORTtoDBL(my_double, my_ushort, 10); printf("VMal(4s): "); for (n = 0; n < 10; ++n) printf("%.3e ", my_double[n]); printf("\n"); #endif //Et(32s) if ((ui_sp_sync & 0x07) == 0) {//1st/8 初期化 pui_cnt0 = pDat->ui_Et; for (n = 0; n < 5*128; ++n) *pui_cnt0++ = 0;//初期化 } if (!pCtrl->uc_snap_ave || !(ui_sp_sync & 0x04)) {//AVERAGEモード時 or 1-4th/8 //Et-SW(32s) for (j = 0; j < 16; ++j) { for (i = 0; i < 16; ++i) { //i_cell = i + 17*j; pui_cnt0 = &pDat->ui_Et[32*i_spinNo]; pus_cnt1 = pus_SWCnt + (i + 17*j)*32; for (k = 0; k < 32; ++k) *pui_cnt0++ += *pus_cnt1++; }} //Et-ALL(32s) for (j = 0; j < 16; ++j) { i_dir = (j+2)/4 + 1; //Etの方角番号 if (i_dir > 4) i_dir = 1; for (i = 0; i < 8; ++i) { //i_cell = i + 9*j; pui_cnt0 = &(pDat->ui_Et[32*i_spinNo + 128*i_dir]); pus_cnt1 = pus_ALLCnt + (i + 9*j)*32; for (k = 0; k < 32; ++k) *pui_cnt0++ += *pus_cnt1++; } } } if (((ui_sp_sync & 0x07) == 3 && pCtrl->uc_snap_ave) || //4th/4@SNAPSHOT ((ui_sp_sync & 0x07) == 7 && !pCtrl->uc_snap_ave) ) { //8th/8@AVERAGE TLMに配置 //app03_MIA_UINTtoUSHORT(pDat->ui_Et, pus_outbuf + d_Lcl_MIA_HK2B + 20 + uc_Lflg[0]*10, 128*5); app04_ENA_Lin2Log(pDat->ui_Et, (unsigned char *)pus_outb_cur, 128*5*4, 0, 0); uc_Lflg = 1;//データ有フラグ #ifdef _RUN_ON_WINDOWS_ printf("Et(32s): \n"); for (n = 0; n < 128*5; ++n) { printf("%d ", pDat->ui_Et[n]); if (n%32 == 31) printf("\n"); } #endif } us_len = 2 + d_Lcl_MIA_HK2B + 20 + uc_Lflg*320;//データ長 pDat->us_Llen_ttl += us_len; uc_info = uc_Lflg*0x10; } else if (i_modeNo == 1) { //M2 磁気圏(高分解) //プロダクト: Et(4s)[4dir x 16en], VM(4s) //pus_ALLCnt = pus_inbuf; //Et(4s) pui_cnt0 = pDat->ui_Et; for (n = 0; n < 4*32; ++n) *pui_cnt0++ = 0;//初期化 for (j = 0; j < 32; ++j) { i_dir = (j+4)/8; //Etの方角番号 if (i_dir > 3) i_dir = 0; for (i = 0; i < 16; ++i) { //pui_cnt0 = &(pDat->ui_Et[32*i_dir]); //pus_cnt1 = pus_ALLCnt + (i + 17*j)*32; //for (k = 0; k < 32; ++k) *pui_cnt0++ += *pus_cnt1++; //Estepの前半は捨てる、後半のみ pui_cnt0 = &(pDat->ui_Et[16*i_dir]); pus_cnt1 = pus_ALLCnt + (i + 17*j)*32 + 16; for (k = 0; k < 16; ++k) *pui_cnt0++ += *pus_cnt1++; }} //VM(4s) for (n = 0; n < 10; ++n) f_VM[n] = 0.; //0.; //初期化 app03_MIA_CalcVM(4, //[INPUT] HVramの中のセクター数 32, //[INPUT] カウントデータのsector数 16, //[INPUT] カウントデータのchannel数 32, //[INPUT] カウントデータのenergy数 i_hvram, //[INPUT] HVram [8] i_spinNo, //[INPUT] SPIN NUMBER 0-3 2, //[INPUT] VMの種類 VMsw-M1(0); VMal-M1(1); VM-M2(2); VM-M3(1) pus_ALLCnt, //[INPUT] カウントデータ(先頭アドレス) f_VM); //[OUTPUT] Velocity moment //TLM用パケットに配置(8-81) app03_MIA_DBLtoUSHORT(f_VM, pus_outb_cur, 10); pus_outb_cur += 10; //app03_MIA_UINTtoUSHORT(&(pDat->ui_Et[0]), pus_outbuf + d_Lcl_MIA_HK2B + 10, 4*32); app04_ENA_Lin2Log(pDat->ui_Et, (unsigned char *)pus_outb_cur, 4*16*4, 0, 0); pus_outb_cur += 32; //app04_ENA_Lin2Log(pDat->ui_Et, (unsigned char *)pus_outb_cur, 4*32*4, 0, 0); pus_outb_cur += 64; #ifdef _RUN_ON_WINDOWS_ VMcal( 4, //[INPUT] HVramの中のセクター数 32, //[INPUT] カウントデータのsector数 16, //[INPUT] カウントデータのchannel数 32, //[INPUT] カウントデータのenergy数 i_hvram, //[INPUT] HVram [8] i_spinNo, //[INPUT] SPIN NUMBER 0-3 2, //[INPUT] VMの種類 VMsw-M1(0); VMal-M1(1); VM-M2(2); VM-M3(1) pus_ALLCnt, //[INPUT] カウントデータ(先頭アドレス) my_double); //[OUTPUT] Velocity moment printf("VMal(4s):@DBL "); for (n = 0; n < 10; ++n) printf("%.3e ", my_double[n]); printf("\n"); printf("VMal(4s): "); for (n = 0; n < 10; ++n) printf("%.3e ", f_VM[n]); printf("\n"); printf("VMal(4s): nV/n"); for (n = 1; n <=3 ; ++n) printf("%.3e ", f_VM[n]/f_VM[0]*0xffff); printf("| %.3e ", app_math_sqrt((f_VM[1]*f_VM[1]+f_VM[2]*f_VM[2]+f_VM[3]*f_VM[3]))/f_VM[0]*0xffff); printf("\n"); app03_MIA_DBLtoUSHORT(f_VM, my_ushort, 10); printf("VMal(4s): "); for (n = 0; n < 10; ++n) printf("%04x ", my_ushort[n]); printf("\n"); USHORTtoDBL(my_double, my_ushort, 10); printf("VMal(4s): "); for (n = 0; n < 10; ++n) printf("%.3e ", my_double[n]); printf("\n"); #endif us_len = 2 + d_Lcl_MIA_HK2B + 10 + 32;//データ長 if (pCtrl->uc_mode < 0x0e || (pDat->us_SPIN_N & 1)) //0x0e 0x0f 特殊モード、1/2でデータを間引く pDat->us_Llen_ttl += us_len; uc_info = 1; } else if (i_modeNo == 2) { //M3 磁気圏(低分解) //プロダクト: Et(4s)[4dir x 16en], VM(4s) //pus_ALLCnt = pus_inbuf; //Et(4s) pui_cnt0 = pDat->ui_Et; for (n = 0; n < 4*32; ++n) *pui_cnt0++ = 0;//初期化 for (j = 0; j < 16; ++j) { i_dir = (j+2)/4; //Etの方角番号 if (i_dir > 3) i_dir = 0; for (i = 0; i < 8; ++i) { //pui_cnt0 = &(pDat->ui_Et[32*i_dir]); //pus_cnt1 = pus_ALLCnt + (i + 9*j)*32; //for (k = 0; k < 32; ++k) *pui_cnt0++ += *pus_cnt1++; //Estepの前半は捨てる、後半のみ pui_cnt0 = &(pDat->ui_Et[16*i_dir]); pus_cnt1 = pus_ALLCnt + (i + 9*j)*32 + 16; for (k = 0; k < 16; ++k) *pui_cnt0++ += *pus_cnt1++; }} //VM(4s) for (n = 0; n < 10; ++n) f_VM[n] = 0.;//0.; //初期化 app03_MIA_CalcVM(2, //[INPUT] HVramの中のセクター数 16, //[INPUT] カウントデータのsector数 8, //[INPUT] カウントデータのchannel数 32, //[INPUT] カウントデータのenergy数 i_hvram, //[INPUT] HVram [8] i_spinNo, //[INPUT] SPIN NUMBER 0-3 1, //[INPUT] VMの種類 VMsw-M1(0); VMal-M1(1); VM-M2(2); VM-M3(1) pus_ALLCnt, //[INPUT] カウントデータ(先頭アドレス) f_VM); //[OUTPUT] Velocity moment //TLM用パケットに配置(8-81) app03_MIA_DBLtoUSHORT(f_VM, pus_outb_cur, 10); pus_outb_cur += 10; //app03_MIA_UINTtoUSHORT(pDat->ui_Et, pus_outbuf + d_Lcl_MIA_HK2B + 10, 4*32); app04_ENA_Lin2Log(pDat->ui_Et, (unsigned char *)pus_outb_cur, 4*16*4, 0, 0); pus_outb_cur += 32; //app04_ENA_Lin2Log(pDat->ui_Et, (unsigned char *)pus_outb_cur, 4*32*4, 0, 0); pus_outb_cur += 64; #ifdef _RUN_ON_WINDOWS_ VMcal( 2, //[INPUT] HVramの中のセクター数 16, //[INPUT] カウントデータのsector数 8, //[INPUT] カウントデータのchannel数 32, //[INPUT] カウントデータのenergy数 i_hvram, //[INPUT] HVram [8] i_spinNo, //[INPUT] SPIN NUMBER 0-3 1, //[INPUT] VMの種類 VMsw-M1(0); VMal-M1(1); VM-M2(2); VM-M3(1) pus_ALLCnt, //[INPUT] カウントデータ(先頭アドレス) my_double); //[OUTPUT] Velocity moment //printf("VMal(4s):@DBL "); //for (n = 0; n < 10; ++n) printf("%.3e ", my_double[n]); //printf("\n"); printf("VMal(4s): "); for (n = 0; n < 10; ++n) printf("%.3e ", f_VM[n]); printf("\n"); printf("VMal(4s): nV/n"); for (n = 1; n <=3 ; ++n) printf("%.3e ", f_VM[n]/f_VM[0]*0xffff); printf("| %.3e ", app_math_sqrt((f_VM[1]*f_VM[1]+f_VM[2]*f_VM[2]+f_VM[3]*f_VM[3]))/f_VM[0]*0xffff); printf("\n"); app03_MIA_DBLtoUSHORT(f_VM, my_ushort, 10); printf("VMal(4s): "); for (n = 0; n < 10; ++n) printf("%04x ", my_ushort[n]); printf("\n"); USHORTtoDBL(my_double, my_ushort, 10); printf("VMal(4s): "); for (n = 0; n < 10; ++n) printf("%.3e ", my_double[n]); printf("\n"); printf("Et(4s):\n"); for (n = 0; n < 4*32; ++n) printf("%04x ", pDat->ui_Et[n]); printf("\n"); #endif us_len = 2 + d_Lcl_MIA_HK2B + 10 + 32;//データ長 if (pCtrl->uc_mode < 0x0e || (pDat->us_SPIN_N & 1)) //0x0e 0x0f 特殊モード、1/2でデータを間引く pDat->us_Llen_ttl += us_len; uc_info = 2; } else { us_len = 2 + d_Lcl_MIA_HK2B; pDat->us_Llen_ttl += us_len; uc_info = 4; //パケットの先頭一部 } // ### SHARED DATA ### /* ***** comment out by YK ***** for (i = 0; i < Gd_TRG_MAX; ++i) if (Gui_TRG1_SpTI_s[i] <= ui_TI ) break; // pDat->ui_TIL if (i < Gd_TRG_MAX) { */ i = app_tiTrgSearch ( pDat->ui_TIL, Gd_N_MIA ); // **** REV by Y.K. 121125 **** if (i) { // **** REV by Y.K. 121125 **** Gus_TRG1_MIA_N[i] = (unsigned short)(f_VM[0]); if (f_VM[0] > 0) { Gs_TRG1_MIA_Vx[i] = (short)(f_VM[1]/f_VM[0]*0xfff); Gs_TRG1_MIA_Vy[i] = (short)(f_VM[2]/f_VM[0]*0xfff); Gs_TRG1_MIA_Vz[i] = (short)(f_VM[3]/f_VM[0]*0xfff); Gus_TRG1_MIA_T[i] = (unsigned short)( (f_VM[4] + f_VM[5] + f_VM[6])/f_VM[0]*0xfff); } else { Gs_TRG1_MIA_Vx[i] = 0; Gs_TRG1_MIA_Vy[i] = 0; Gs_TRG1_MIA_Vz[i] = 0; Gus_TRG1_MIA_T[i] = 0; } for (j = 0; j < 7; ++j) Guc_TRG1_MIA_Esp[i][j] = (unsigned char)(pDat->ui_Et[j*2]/0xffffff); } } //###################### エンジニアリングモード ######################## else if (pCtrl->uc_eng_sci == 1) { //プロダクト: SCI(28B), HV(24B) n = pDat->uc_hdrL[6]; //サイエンスデータカウンタ memcpy(pus_outb_cur, pDat->uc_HVinf + d_Lcl_MIA_HVB_SIZE*n, d_Lcl_MIA_HVB_SIZE);//HV bulk AD packet //データ長 us_len = 2 + d_Lcl_MIA_HK2B + d_Lcl_MIA_HVB_SIZE/2; pDat->us_Llen_ttl += us_len; uc_info = 3; //コメント INFO } else { us_len = 2 + d_Lcl_MIA_HK2B; pDat->us_Llen_ttl += us_len; uc_info = 5; //パケットの先頭一部 } //先頭2B入力 *pus_outb_cur0++ = uc_se_mode*0x100 + uc_info; //MPPE mode + MDPinfo *pus_outb_cur0 = us_len*2; //データ長 //TLM出力 if (pDat->us_SPIN_N%16 == 15 || pDat->us_Llen_ttl > 1500) { //16th spin or > 3kB app03_MIA_tlmout(Gd_N_MIA, //[INPUT] sensor ID pCtrl->uc_vet_cmp_ena, //[INPUT] 圧縮フラグ pDat->us_Llen_ttl, //[INPUT] data長さ uc_se_mode + 0x40, //[INPUT] Comment2 uc_info, //[INPUT] Comment3 pus_outbuf, //[INPUT] 圧縮前のプロダクト pus_midbuf, //[MID] 圧縮後バッファ pDat->ui_TIL, //[INPUT] TI 0); //[INPUT] フラグ、0:L, 1: M, 4-9:H(DR-IDにそのまま使う) pDat->us_Llen_ttl = 0; } //3D-LL-M1 SW 900spinに1回 if (pDat->us_SPIN_N == d_Lcl_MIA_3DLL && pCtrl->uc_eng_sci == 0) { memcpy(G03uc_data, pDat->uc_hdrL, 4); //TI 4B //8kB以上なので4分割 if (i_modeNo == 0) { us_len = 4*17*32 +2; n = 4; uc_info = 4;} else if (i_modeNo == 1) { us_len = 4*17*32 +2; n = 4; uc_info = 5;} else if (i_modeNo == 2) { us_len = 8*9*32 +2; n = 2; uc_info = 6;} else { us_len = 0; n = 0;} pus_cnt1 = (unsigned short*)G03uc_data; for (i = 0; i < n; ++i) { app03_MIA_tlmout(Gd_N_MIA, //[INPUT] sensor ID pCtrl->uc_vet_cmp_ena, //[INPUT] 圧縮フラグ us_len, //[INPUT] data長さ uc_se_mode, //[INPUT] Comment2 uc_info + i*0x10, //[INPUT] Comment3 pus_cnt1 + us_len*i, //[INPUT] 圧縮前のプロダクト pus_midbuf, //[MID] 圧縮後バッファ pDat->ui_TIL, //[INPUT] TI 0); //[INPUT] フラグ、0:L, 1: M, 4-9:H(DR-IDにそのまま使う) if(i == 0) us_len -= 2; } if (i_modeNo == 1) memcpy(pDat->us_3DLL, pus_ALLCnt + 16*17*32, 16*17*32*2); //半分を保存 //#ifdef _RUN_ON_WINDOWS_ //printf("3D-LL-M1: \n"); //for (n = 0; n < 16*17*32; ++n) { // printf("%d ", *pus_SWCnt++); // if (n%32 == 31) printf("\n"); //} //#endif } else if (pDat->us_SPIN_N == d_Lcl_MIA_3DLL + 1 && pCtrl->uc_eng_sci == 0 && i_modeNo == 1) { //残り半分TLM 4分割 for (i = 0; i < 4; ++i) app03_MIA_tlmout(Gd_N_MIA, //[INPUT] sensor ID pCtrl->uc_vet_cmp_ena, //[INPUT] 圧縮フラグ 4*17*32, //[INPUT] data長さ uc_se_mode, //[INPUT] Comment2 5 + (i+4)*0x10, //[INPUT] Comment3 pDat->us_3DLL + 4*17*32*i,//[INPUT] 圧縮前のプロダクト pus_midbuf, //[MID] 圧縮後バッファ pDat->ui_TIL, //[INPUT] TI 0); //[INPUT] フラグ、0:L, 1: M, 4-9:H(DR-IDにそのまま使う) } //カウンタをリセット M3(640s) or M1-2(3600s) if (pDat->us_SPIN_N >= 159 && i_modeNo == 2 && (pDat->us_SPIN_N & 1) ) pDat->us_SPIN_N = 0xffff; if (pDat->us_SPIN_N == 899) pDat->us_SPIN_N = 0xffff; return (TRUE); } int app03_MIA_GetVelcity( int i_ram, //[INPUT] HV RAM NUMBER 0-5 int i_spinNo) //[INPUT] SPIN NUMBER 0-3 //return : Address of Velocity packet { int i_eng; if (i_ram == 0) i_eng = 32*i_spinNo; //T0 else if (i_ram == 1) i_eng = 32*i_spinNo + 128; //T1 else if (i_ram == 2) i_eng = 32*(i_spinNo & 0x01) + 128*2; //T2 else if (i_ram == 3) i_eng = 128*2 + 64; //T3 else if (i_ram == 4) i_eng = 128*2 + 64 + 32; //T4 else if (i_ram == 5) i_eng = 128*2 + 64 + 32*2; //T5 else i_eng = 0; //例外処理 return i_eng; } char app03_MIA_CalcVM( int i_Dsc, //[INPUT] HVramの中のセクター数 int i_num_sc, //[INPUT] カウントデータのsector数 int i_num_ch, //[INPUT] カウントデータのchannel数 int i_num_en, //[INPUT] カウントデータのenergy数 int i_HVram[], //[INPUT] HVram [8] int i_spinNo, //[INPUT] SPIN NUMBER 0-3 int i_VMMode, //[INPUT] VMの種類 VMsw-M1(0); VMal-M1(1); VM-M2(2); VM-M3(1) unsigned short us_cnt[], //[INPUT] カウントデータ(先頭アドレス) double f_VM[]) //[OUTPUT] Velocity moment { int i, j, k, n; int i_cell, i_c, i_cs, i_n, i_sp, i_eng; double f_VMt[3]; double f_vtb; int i_prmaddr; int i_ram_offset; unsigned char ucf[32]; struct _s_MIA_ProcParam *pP; //解析用パラメータ struct _s_MIA_CtrlParam *pCtrl; //制御用のフラグ及びパラメータ pCtrl = &Gst_MIA_ctrl; pP = &Gst_MIA_proc; //Energy step 使用・未使用のフラグ for (k = 0; k < 32; ++k) ucf[k] = pCtrl->ui_eng_vmf >> k & 0x01; //i_ram_offset: SW時はセクターが途中から始まるのでOFFSETをつける //i_prmaddr: gfテーブルなどの開始アドレス if (i_VMMode == 0) { i_prmaddr = 0; i_ram_offset = 1; } else if (i_VMMode == 1) { i_prmaddr = 16*2; i_ram_offset = 0; } else if (i_VMMode == 2) { i_prmaddr = 16*2 + 8*2; i_ram_offset = 0; } else { i_prmaddr = 0; i_ram_offset = 0; } for (j = 0; j < i_num_sc; ++j) { //HV Sweep Type T0-5 i_eng = app03_MIA_GetVelcity(i_HVram[j/i_Dsc + i_ram_offset], i_spinNo); //スポイラー T1のときのみON if (i_HVram[j/i_Dsc + i_ram_offset] == 1) i_sp = 1; else i_sp = 0; for (i = 0; i < i_num_ch; ++i) { i_cell = i + j*(i_num_ch + 1); i_c = i + i_sp*i_num_ch + i_prmaddr; i_cs = i + j*i_num_ch + i_sp*i_num_ch*i_num_sc + i_prmaddr*16; for (n = 0; n < 3; ++n) f_VMt[n] = 0.; //初期化 for (k = 0; k < i_num_en; ++k) { if (!pP->us_vlc[k +i_eng] ||!ucf[k]) continue; //0割、Vテーブル不使用FLG時はスキップ i_n = i_cell*i_num_en + k; f_VMt[0] += (double)us_cnt[i_n]/pP->us_vlc[k +i_eng]; f_VMt[1] += (double)us_cnt[i_n]; f_VMt[2] += (double)us_cnt[i_n]*pP->us_vlc[k +i_eng]; } f_vtb = (double)pP->us_gf[i_c]*pP->s_csp[i_c]; f_VMt[0] *= f_vtb/(d_LCl_MIA_TBL_VF0 + pP->uc_vf[i_c]); f_VMt[1] *= f_vtb; f_VMt[2] *= f_vtb*(d_LCl_MIA_TBL_VF0 + pP->uc_vf[i_c]); f_VM[0] += f_VMt[0]; f_VM[1] += f_VMt[1]*pP->s_csp[i_c] *pP->s_csa[i_cs]; f_VM[2] += f_VMt[1]*pP->s_csp[i_c] *pP->s_sna[i_cs]; f_VM[3] += f_VMt[1]*pP->s_snp[i_c]; f_VM[4] += f_VMt[2]*pP->s_csp[i_c]*pP->s_csp[i_c]*pP->s_csa[i_cs]*pP->s_csa[i_cs]; f_VM[5] += f_VMt[2]*pP->s_csp[i_c]*pP->s_csp[i_c]*pP->s_sna[i_cs]*pP->s_sna[i_cs]; f_VM[6] += f_VMt[2]*pP->s_snp[i_c]*pP->s_snp[i_c]; f_VM[7] += f_VMt[2]*pP->s_csp[i_c]*pP->s_csp[i_c]*pP->s_csa[i_cs]*pP->s_sna[i_cs]; f_VM[8] += f_VMt[2]*pP->s_csp[i_c]*pP->s_snp[i_c]*pP->s_sna[i_cs]; f_VM[9] += f_VMt[2]*pP->s_csp[i_c]*pP->s_snp[i_c]*pP->s_csa[i_cs]; } } f_VM[0] /= d_Lcl_MIA_N_NRM; f_VM[1] /= d_Lcl_MIA_V3_NRM; f_VM[2] /= d_Lcl_MIA_V3_NRM; f_VM[3] /= d_Lcl_MIA_V2_NRM; f_VM[4] /= d_Lcl_MIA_P5_NRM; f_VM[5] /= d_Lcl_MIA_P5_NRM; f_VM[6] /= d_Lcl_MIA_P3_NRM; f_VM[7] /= d_Lcl_MIA_P5_NRM; f_VM[8] /= d_Lcl_MIA_P4_NRM; f_VM[9] /= d_Lcl_MIA_P4_NRM; return TRUE; } char app03_MIA_makeM(unsigned int ui_sunpulseCnt, // [INPUT] Sun Pulse unsigned short *pus_inbuf, // [INPUT] COUNT data unsigned short *pus_outbuf, // [OUTPUT] Product unsigned short *pus_midbuf) // [MID] buffer for comp { int i, k; int i_modeNo, i_spinNo; unsigned short *pus_cnt0, *pus_cnt1; unsigned short *pus_ALLCnt; //, *pus_SWCnt; unsigned int ui_sp_sync; unsigned char uc_se_mode, uc_info; //->TLM unsigned short us_Mlen = 0; struct _s_MIA_Product *pDat; //プロダクト struct _s_MIA_CtrlParam *pCtrl; //制御用のフラグ及びパラメータ pDat = &Gst_MIA_dat; pCtrl = &Gst_MIA_ctrl; //上位ビットから読む i_modeNo = (pDat->uc_hdrL[8] >> 4) & 0x0f; //(0-2) データモード i_spinNo = pDat->uc_hdrL[8] & 0x0f; //(0-3) スピンカウンタ:エネルギーテーブル対応に使用 //CHECK if (i_modeNo > 2) i_modeNo = 0; //return (FALSE); if (i_spinNo > 3) i_spinNo = 0; //HK(SCI hdr) and TI memcpy(pus_outbuf, pDat->uc_hdrL, d_Lcl_MIA_HK2B*2); //HK //マルチスピンデータ用のカウンタ ui_sp_sync = pDat->uc_hdrL[6]; //データ同期カウンタ //ui_sp_sync = sunpulseCnt; //MDPから供給のカウンタ //SCI/ENG モード -> TLM uc_se_mode = pCtrl->uc_snap_ave + pCtrl->uc_eng_sci*2 + (pCtrl->uc_mode << 2 & 0x3c); uc_info = 0; // M-mode Data if (pCtrl->uc_eng_sci == 0) {//サイエンスモード //分析器のデータモード if (i_modeNo == 0) { //M1 太陽風 //pus_SWCnt = pus_inbuf; //[16sc][16+1ch][32en] pus_ALLCnt = pus_inbuf + d_Lcl_MIA_SW1_ADRR/2; //[16sc[8+1ch][32en] if (pCtrl->uc_mode < 6) { uc_info = 0; //コメント INFO //プロダクト: 3D-LL(8s) [88+1dir][32en] if ((ui_sp_sync & 0x01) == 0) { //1st/2 app03_MIA_88dir(pus_ALLCnt, //[INPUT] 元カウントデータ pus_outbuf + d_Lcl_MIA_HK2B, //[OUTPUT]出力バッファ FALSE); //[INPUT] FALSE:代入 if (pCtrl->uc_snap_ave) us_Mlen = d_Lcl_MIA_HK2B + 32*89; //データ長 SNAPSHOTはTLM送信 else us_Mlen = 0; // AVERAGEは処理のみ } else { //2nd/2 if (pCtrl->uc_snap_ave) us_Mlen = 0; //データ長 SNAPSHOTは処理TLM送信無し else { us_Mlen = d_Lcl_MIA_HK2B + 32*89; //データ長 AVERAGEは加算してTLM送信 app03_MIA_88dir(pus_ALLCnt, //[INPUT] 元カウントデータ pus_outbuf + d_Lcl_MIA_HK2B, //[OUTPUT]出力バッファ TRUE); //[INPUT] TRUE:加算 } } } else { //Option 2 //pDat->uc_info = 7; //コメント INFO //pus_cnt0 = pus_outbuf + d_Lcl_MIA_HK2B; //for (i = 0; i < 16; ++i) { // memcpy(pus_cnt0 + 5*32*i, pus_inbuf + 6*32 + 17*32*i, 4*32*2); //中央4CH(6-9) // memcpy(pus_cnt0 + (4 + 5*i)*32, pus_inbuf + 16*32 + 17*32*i, 32*2); //BGCH //} //pDat->us_Mlen = d_Lcl_MIA_HK2B + 16*5*32; //データ長 //Option 1 uc_info = 7; //コメント INFO //プロダクト: 3D-L2(4s) [4sc][16+1ch][32en] memcpy(pus_outbuf + d_Lcl_MIA_HK2B, pus_inbuf + 6*17*32, 4*17*32*2); //中央4sec x 16+1ch us_Mlen = d_Lcl_MIA_HK2B + 4*17*32; //データ長 } } else if (i_modeNo == 1) { //M2 MG H //プロダクト: 3D-LL(us_pac, &pDat->us_3DL2[d_Lcl_MIA_HK2B], 1);8s) 32en x 8+1ch x 16sc uc_info = 1; //コメント INFO if ((ui_sp_sync & 0x01) == 0) {//1st/2 app03_MIA_3DM_M2(pus_inbuf, //[INPUT] 元カウントデータ pus_outbuf + d_Lcl_MIA_HK2B, //[OUTPUT]出力バッファ FALSE); //[INPUT] FALSE:代入 if (pCtrl->uc_snap_ave) us_Mlen = d_Lcl_MIA_HK2B + 32*9*16; //データ長 SNAPSHOT時TLM送信 else us_Mlen = 0; // AVERAGEは処理のみ } else { //2nd/2 if (pCtrl->uc_snap_ave) us_Mlen = 0; //データ長 SNAPSHOTは処理TLM送信無し else { us_Mlen = d_Lcl_MIA_HK2B + 32*9*16; //データ長 AVERAGEは加算してTLM送信 app03_MIA_3DM_M2(pus_inbuf, //[INPUT] 元カウントデータ pus_outbuf + d_Lcl_MIA_HK2B, //[OUTPUT]出力バッファ TRUE); //[INPUT] TRUE:加算 } } } else if (i_modeNo == 2) { //M3 MG L //プロダクト: 3D-LL(8s) 32en x 88+1dir or if (pCtrl->uc_mode >= 6 && pCtrl->uc_mode <= 0x0e) { uc_info = 2; //コメント INFO if ((ui_sp_sync & 0x01) == 0) { //1st/2 app03_MIA_88dir(pus_inbuf, //[INPUT] 元カウントデータ pus_outbuf + d_Lcl_MIA_HK2B, //[OUTPUT]出力バッファ FALSE); //[INPUT] FALSE:代入 if (pCtrl->uc_snap_ave) us_Mlen = d_Lcl_MIA_HK2B + 32*89; //データ長 SNAPSHOT時TLM送信 else us_Mlen = 0; // AVERAGEは処理のみ } else { //2nd/2 if (pCtrl->uc_snap_ave) us_Mlen = 0; //データ長 SNAPSHOTは処理TLM送信無し else { us_Mlen = d_Lcl_MIA_HK2B + 32*89; //データ長 AVERAGEは加算してTLM送信 app03_MIA_88dir(pus_inbuf, //[INPUT] 元カウントデータ pus_outbuf + d_Lcl_MIA_HK2B, //[OUTPUT]出力バッファ TRUE); //[INPUT] TRUE:加算 } } } //プロダクト: 3D-LL(16s) 32en x 8+1ch x 16sc // --> 3D-L2(4s) [88+1dir][16en]に改訂 Oct. 2013 else { uc_info = 3; //コメント INFO app03_MIA_88dir(pus_inbuf, //[INPUT] 元カウントデータ pus_outbuf + d_Lcl_MIA_HK2B, //[OUTPUT]出力バッファ FALSE); //[INPUT] FALSE:代入 //16en 後半切り出し pus_cnt0 = pus_outbuf + d_Lcl_MIA_HK2B; pus_cnt1 = pus_outbuf + d_Lcl_MIA_HK2B; for (i = 0; i < 89; ++i) { pus_cnt1 += 16; //前半が良い場合はこの2列を入れ替える for (k = 0; k < 16; ++k) *pus_cnt0++ = *pus_cnt1++; } us_Mlen = d_Lcl_MIA_HK2B + 16*89; //データ長 } } else { us_Mlen = d_Lcl_MIA_HK2B; //データ長 uc_info = 5; //コメント INFO //パケットの先頭一部をTLM } } //###################### エンジニアリングモード ######################## else if (pCtrl->uc_eng_sci == 1) { //プロダクト: SCI(28B):既に代入 pus_cnt0 = pus_outbuf + d_Lcl_MIA_HK2B; //ASIC(12x4B) memcpy(pus_cnt0, pDat->uc_ASICinf, d_Lcl_MIA_ASC_SIZE*d_Lcl_MIA_ASC_SPNN); pus_cnt0 += d_Lcl_MIA_ASC_SIZE*d_Lcl_MIA_ASC_SPNN/2; //HV(256x24B)/4spin i = d_Lcl_MIA_HVB_SIZE*d_Lcl_MIA_HVB_SPNN/4; memcpy(pus_cnt0, pDat->uc_HVinf + i_spinNo*i, i); //Spin No.にて切り出し部分決定 uc_info = 4; //コメント INFO us_Mlen = d_Lcl_MIA_HK2B + (d_Lcl_MIA_ASC_SIZE*d_Lcl_MIA_ASC_SPNN + i)/2; //データ長 } else { us_Mlen = d_Lcl_MIA_HK2B; //データ長 uc_info = 6; //コメント INFO //パケットの先頭一部をTLM } if (us_Mlen == d_Lcl_MIA_HK2B + 32*9*16){ //pCtrl->uc_eng_sci == 0 && i_modeNo == 1 //8kB以上なので2分割 app03_MIA_tlmout(Gd_N_MIA, //[INPUT] sensor ID pCtrl->uc_vet_cmp_ena, //[INPUT] 圧縮フラグ d_Lcl_MIA_HK2B + 16*9*16, //[INPUT] data長さ uc_se_mode, //[INPUT] Comment2 uc_info, //[INPUT] Comment3 pus_outbuf, //[INPUT] 圧縮前のプロダクト pus_midbuf, //[MID] 圧縮後バッファ pDat->ui_TIL, //[INPUT] TI 1); //[INPUT] フラグ、0:L, 1: M, 4-9:H(DR-IDにそのまま使う) app03_MIA_tlmout(Gd_N_MIA, //[INPUT] sensor ID pCtrl->uc_vet_cmp_ena, //[INPUT] 圧縮フラグ 16*9*16, //[INPUT] data長さ uc_se_mode, //[INPUT] Comment2 uc_info + 0x10, //[INPUT] Comment3 pus_outbuf + d_Lcl_MIA_HK2B + 16*9*16,//[INPUT] 圧縮前のプロダクト pus_midbuf, //[MID] 圧縮後バッファ pDat->ui_TIL, //[INPUT] TI 1); //[INPUT] フラグ、0:L, 1: M, 4-9:H(DR-IDにそのまま使う) } else { app03_MIA_tlmout(Gd_N_MIA, //[INPUT] sensor ID pCtrl->uc_vet_cmp_ena, //[INPUT] 圧縮フラグ us_Mlen, //[INPUT] data長さ uc_se_mode, //[INPUT] Comment2 uc_info, //[INPUT] Comment3 pus_outbuf, //[INPUT] 圧縮前のプロダクト pus_midbuf, //[MID] 圧縮後バッファ pDat->ui_TIL, //[INPUT] TI 1); //[INPUT] フラグ、0:L, 1: M, 4-9:H(DR-IDにそのまま使う) } return TRUE; } char app03_MIA_tlmout( unsigned char uc_nodeId, //[INPUT] sensor ID unsigned char uc_vetcmpena, //[INPUT] 圧縮フラグ unsigned short us_len_total, //[INPUT] data長さ unsigned char uc_cm2_mod, //[INPUT] Comment2 unsigned char uc_cm3_inf, //[INPUT] Comment3 unsigned short *pus_inbuf, //[INPUT] 圧縮前のプロダクト unsigned short *pus_midbuf, //[MID] 圧縮後バッファ unsigned int ui_TI, //[INPUT] TI unsigned char uc_lmhflg) //[INPUT] フラグ、0:L, 1: M, 4-9:H(DR-IDにそのまま使う) { unsigned char uc_cmp; // rev by YK 121125 unsigned short us_outsize; int ii; unsigned char uc_drid, uc_commentSize, uc_cmnt[8]; unsigned char uc_appID; unsigned short *pus_tlm; int i_rice_format; //データ長が0の場合は何も作成しない if (us_len_total == 0) return FALSE; uc_appID = (uc_lmhflg <= 1) ? 3 : 5; uc_drid = (uc_lmhflg <= 1) ? uc_lmhflg+2 : uc_lmhflg; //RICE_FMT_UINT i_rice_format = (uc_cm2_mod & 0xc0) ? RICE_FMT_UINT8 : RICE_FMT_UINT16; if (uc_vetcmpena || //圧縮禁止 (uc_nodeId == Gd_N_MIA && uc_lmhflg == 1 && uc_cm3_inf == 4)) { //MIA ENG M-product //Guc_TLMm_cmp[Gd_N_MIA] = 0; // *** rev 121125 by YK *** app01で実行 uc_cmp = 0; // non compress // *** rev 121125 by YK *** us_outsize = us_len_total*2; //バイト長入力なので、USワード長を2倍にする //memcpy(pus_midbuf, pus_inbuf, us_outsize); pus_tlm = pus_inbuf; } else { //RICE圧縮を行う //Guc_TLMm_cmp[Gd_N_MIA] = 3; // *** rev 121125 by YK *** app01で実行 uc_cmp = 3; // 3:After-User-COMP // *** rev 121125 by YK *** us_outsize = Rice_Compress(pus_inbuf, pus_midbuf, us_len_total*2, i_rice_format); pus_tlm = pus_midbuf; } //コメント uc_cmnt[0] = d_Lcl_MIA_TLMID0; if (uc_nodeId == Gd_N_MEA1) uc_cmnt[1] = d_Lcl_MEA1_TLMID1; else if (uc_nodeId == Gd_N_MEA2) uc_cmnt[1] = d_Lcl_MEA2_TLMID1; else if (uc_nodeId == Gd_N_MIA) uc_cmnt[1] = d_Lcl_MIA_TLMID1; else if (uc_nodeId == Gd_N_MSA) uc_cmnt[1] = d_Lcl_MSA_TLMID1; else return FALSE; uc_cmnt[2] = uc_cm2_mod; uc_cmnt[3] = uc_cm3_inf; uc_cmnt[4] = us_len_total*2 >> 8 & 0xff; //圧縮前データサイズ, 2Bのワード長なので2倍する uc_cmnt[5] = us_len_total*2 & 0xff; uc_cmnt[6] = us_outsize >> 8 & 0xff; // 圧縮後データサイズ uc_cmnt[7] = us_outsize & 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)] //Guc_TLMm_cmp[Gd_N_MIA], // *** rev 121125 by YK *** uc_cmp, // [INPUT] Comp mode [0:non 1:JPEG-rev 2:JPEG-nonrev 3:After-User-COMP // 4: User defined pre-compression] 0xff, // [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_tlm,// [INPUT]**Data <<<< USER-DEF: <0x1E00 >>>> (int)us_outsize); // [INPUT]**Data - Size \ <<<< USER-DEF: <0x1E00 >>>> return TRUE; } // // Debug用 // /* char app03_MIA_tlmout2( 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_MIA_Product *pDat; //プロダクト struct _s_MIA_CtrlParam *pCtrl; //制御用のフラグ及びパラメータ pDat = &Gst_MIA_dat; pCtrl = &Gst_MIA_ctrl; uc_appID = 3; uc_drid = 2; us_length = 32*25/2; ui_TI = 0xee; //L mode uc_pacId = 0xcc; //サイエンスデータカウンタをパケットIDとして使う 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; // 3:After-User-COMP us_outsize = Rice_Compress(pus_inbuf, pus_outbuf, us_length*2, RICE_FMT_UINT16); } //コメント uc_cmnt[0] = d_Lcl_MIA_TLMID0; uc_cmnt[1] = d_Lcl_MIA_TLMID1; uc_cmnt[2] = pCtrl->uc_snap_ave | (pCtrl->uc_eng_sci << 1 & 0x02) | (pCtrl->uc_mode << 2 & 0xfc); uc_cmnt[3] = 0; 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; ii = app_PutTlm( uc_appID, // [INPUT] APP-NUM Gd_N_MIA, // [INPUT] Node-ID 0, // [INPUT] Data-ID Gd_N_MIA, // [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; } */ ////[16sc][8+1ch][32en] --> [88+1dir][32en] // 3D-L2-M1(8s) [88+1dir][32en] M-mode // 3D-L2-M3(8s) [88+1dir][32en] M-mode // 3D-L2-M1(4s) [88+1dir][32en] H-mode 同一のバッファを使う //uc_f: TRUE 加算 FALSE 代入 char app03_MIA_88dir(unsigned short *pus_inbuf, unsigned short *pus_outbuf, unsigned char uc_f) { int j, k, i_cell; unsigned short *pus_cnt0, *pus_cnt1, *pus_cnt2; i_cell = 32; if (uc_f) { //Center BG 0 for (j = 0; j < 16; ++j) { pus_cnt0 = pus_outbuf; pus_cnt1 = pus_inbuf + (8 + 9*j)*i_cell; for (k = 0; k < 32; ++k) *pus_cnt0++ += *pus_cnt1++; } //1-89 for (j = 0; j < 4; ++j) { pus_cnt0 = pus_outbuf + ( 1 + 22*j)*i_cell; pus_cnt1 = pus_inbuf + ( 1 + 36*j)*i_cell; pus_cnt2 = pus_inbuf + (10 + 36*j)*i_cell; for (k = 0; k < i_cell; ++k) *pus_cnt0++ += *pus_cnt1++ + *pus_cnt2++; //cell = 1 for (k = 0; k < i_cell*4; ++k) *pus_cnt0++ += *pus_cnt1++; //cell = 2-5 pus_cnt2 = pus_inbuf + (15 + 36*j)*i_cell; for (k = 0; k < i_cell; ++k) *pus_cnt0++ += *pus_cnt1++ + *pus_cnt2++; //cell = 6 pus_cnt1 = pus_inbuf + (11 + 36*j)*i_cell; for (k = 0; k < i_cell*4; ++k) *pus_cnt0++ += *pus_cnt1++; //cell = 7-10 pus_cnt1 = pus_inbuf + (18 + 36*j)*i_cell; pus_cnt2 = pus_inbuf + (27 + 36*j)*i_cell; for (k = 0; k < i_cell*2; ++k) *pus_cnt0++ += *pus_cnt1++ + *pus_cnt2++; //cell = 11,12 for (k = 0; k < i_cell*4; ++k) *pus_cnt0++ += *pus_cnt1++; //cell = 13-16 pus_cnt2 = pus_inbuf + (33 + 36*j)*i_cell; for (k = 0; k < i_cell*2; ++k) *pus_cnt0++ += *pus_cnt1++ + *pus_cnt2++; //cell = 17,18 pus_cnt1 = pus_inbuf + (29 + 36*j)*i_cell; for (k = 0; k < i_cell*4; ++k) *pus_cnt0++ += *pus_cnt1++; //cell = 19-22 } } else { //Center BG 0 pus_cnt0 = pus_outbuf; pus_cnt1 = pus_inbuf + 8*i_cell; for (k = 0; k < 32; ++k) *pus_cnt0++ = *pus_cnt1++; for (j = 1; j < 16; ++j) { pus_cnt0 = pus_outbuf; pus_cnt1 = pus_inbuf + (8 + 9*j)*i_cell; for (k = 0; k < 32; ++k) *pus_cnt0++ += *pus_cnt1++; } //1-89 for (j = 0; j < 4; ++j) { pus_cnt0 = pus_outbuf + ( 1 + 22*j)*i_cell; pus_cnt1 = pus_inbuf + ( 1 + 36*j)*i_cell; pus_cnt2 = pus_inbuf + (10 + 36*j)*i_cell; for (k = 0; k < i_cell; ++k) *pus_cnt0++ = *pus_cnt1++ + *pus_cnt2++; //cell = 1 for (k = 0; k < i_cell*4; ++k) *pus_cnt0++ = *pus_cnt1++; //cell = 2-5 pus_cnt2 = pus_inbuf + (15 + 36*j)*i_cell; for (k = 0; k < i_cell; ++k) *pus_cnt0++ = *pus_cnt1++ + *pus_cnt2++; //cell = 6 pus_cnt1 = pus_inbuf + (11 + 36*j)*i_cell; for (k = 0; k < i_cell*4; ++k) *pus_cnt0++ = *pus_cnt1++; //cell = 7-10 pus_cnt1 = pus_inbuf + (18 + 36*j)*i_cell; pus_cnt2 = pus_inbuf + (27 + 36*j)*i_cell; for (k = 0; k < i_cell*2; ++k) *pus_cnt0++ = *pus_cnt1++ + *pus_cnt2++; //cell = 11,12 for (k = 0; k < i_cell*4; ++k) *pus_cnt0++ = *pus_cnt1++; //cell = 13-16 pus_cnt2 = pus_inbuf + (33 + 36*j)*i_cell; for (k = 0; k < i_cell*2; ++k) *pus_cnt0++ = *pus_cnt1++ + *pus_cnt2++; //cell = 17,18 pus_cnt1 = pus_inbuf + (29 + 36*j)*i_cell; for (k = 0; k < i_cell*4; ++k) *pus_cnt0++ = *pus_cnt1++; //cell = 19-22 } } return TRUE; } //M2 data [32sc][32+2ch][32en]--Packetread--> [32sc][16+1ch][32en] --> // 3D-L2-M2(8s) [16sc][8+1ch][32en] M-mode //uc_f: TRUE 加算 // FALSE 代入 char app03_MIA_3DM_M2(unsigned short *pus_inbuf, unsigned short *pus_outbuf, unsigned char uc_f) { int i, j, k; unsigned short *pus_cnt0, *pus_cnt1, *pus_cnt2, *pus_cnt3, *pus_cnt4; // for (j = 0; j < 16; ++j) // for (i = 0; i < 17; ++i) //i = 16 center back ground // for (k = 0; k < 32; ++k) // *(pus_outbuf + k + i/2*32 + j/2*288) += *(pus_inbuf + k + i*32 + j*544); if (uc_f) { for (j = 0; j < 16; ++j) { for (i = 0; i < 8; ++i) { pus_cnt0 = pus_outbuf + i*32 + j*288; pus_cnt1 = pus_inbuf + 2*i*32 + 2*j*544; pus_cnt2 = pus_inbuf + (2*i+1)*32 + 2*j*544; pus_cnt3 = pus_inbuf + 2*i*32 + (2*j+1)*544; pus_cnt4 = pus_inbuf + (2*i+1)*32 + (2*j+1)*544; for (k = 0; k < 32; ++k) *pus_cnt0++ += *pus_cnt1++ + *pus_cnt2++ + *pus_cnt3++ + *pus_cnt4++; } i = 8; pus_cnt0 = pus_outbuf + i*32 + j*288; pus_cnt1 = pus_inbuf + 2*i*32 + 2*j*544; pus_cnt2 = pus_inbuf + 2*i*32 + (2*j+1)*544; for (k = 0; k < 32; ++k) *pus_cnt0++ += *pus_cnt1++ + *pus_cnt2++; } } else { for (j = 0; j < 16; ++j) { for (i = 0; i < 8; ++i) { pus_cnt0 = pus_outbuf + i*32 + j*288; pus_cnt1 = pus_inbuf + 2*i*32 + 2*j*544; pus_cnt2 = pus_inbuf + (2*i+1)*32 + 2*j*544; pus_cnt3 = pus_inbuf + 2*i*32 + (2*j+1)*544; pus_cnt4 = pus_inbuf + (2*i+1)*32 + (2*j+1)*544; for (k = 0; k < 32; ++k) *pus_cnt0++ = *pus_cnt1++ + *pus_cnt2++ + *pus_cnt3++ + *pus_cnt4++; } i = 8; pus_cnt0 = pus_outbuf + i*32 + j*288; pus_cnt1 = pus_inbuf + 2*i*32 + 2*j*544; pus_cnt2 = pus_inbuf + 2*i*32 + (2*j+1)*544; for (k = 0; k < 32; ++k) *pus_cnt0++ = *pus_cnt1++ + *pus_cnt2++; } } return TRUE; } // // 32bit UINT linear -> 16bit UCHAR x 2 log // 32bit -> 8bit UCHAR app04_MPPE-ENA.c /* char app03_MIA_UINTtoUSHORT(unsigned int *pinbuf, unsigned short *poutbuf, unsigned int len) { int i; unsigned int ui; for(i = 0; i < len; i++){ //ui = *pinbuf++ - offset; ui = *pinbuf++; if ( !(ui & 0xffffc000) ) *poutbuf++ = (ui & 0x3fff); else if( !(ui & 0xffff8000) ) *poutbuf++ = ( 0x4000 | ((ui >> 2) & 0x0fff) ); else if( !(ui & 0xffff0000) ) *poutbuf++ = ( 0x5000 | ((ui >> 3) & 0x0fff) ); else if( !(ui & 0xfffe0000) ) *poutbuf++ = ( 0x6000 | ((ui >> 4) & 0x0fff) ); else if( !(ui & 0xfffc0000) ) *poutbuf++ = ( 0x7000 | ((ui >> 5) & 0x0fff) ); else if( !(ui & 0xfff80000) ) *poutbuf++ = ( 0x8000 | ((ui >> 6) & 0x0fff) ); else if( !(ui & 0xfff00000) ) *poutbuf++ = ( 0x9000 | ((ui >> 7) & 0x0fff) ); else if( !(ui & 0xffe00000) ) *poutbuf++ = ( 0xa000 | ((ui >> 9) & 0x07ff) ); else if( !(ui & 0xffc00000) ) *poutbuf++ = ( 0xa800 | ((ui >> 10) & 0x07ff) ); else if( !(ui & 0xff800000) ) *poutbuf++ = ( 0xb000 | ((ui >> 11) & 0x07ff) ); else if( !(ui & 0xff000000) ) *poutbuf++ = ( 0xb800 | ((ui >> 12) & 0x07ff) ); else if( !(ui & 0xfe000000) ) *poutbuf++ = ( 0xc000 | ((ui >> 13) & 0x07ff) ); else if( !(ui & 0xfc000000) ) *poutbuf++ = ( 0xc800 | ((ui >> 14) & 0x07ff) ); else if( !(ui & 0xf8000000) ) *poutbuf++ = ( 0xd000 | ((ui >> 15) & 0x07ff) ); else if( !(ui & 0xf0000000) ) *poutbuf++ = ( 0xd800 | ((ui >> 16) & 0x07ff) ); else if( !(ui & 0xe0000000) ) *poutbuf++ = ( 0xe000 | ((ui >> 17) & 0x07ff) ); else if( !(ui & 0xc0000000) ) *poutbuf++ = ( 0xe800 | ((ui >> 18) & 0x07ff) ); else if( !(ui & 0x80000000) ) *poutbuf++ = ( 0xf000 | ((ui >> 19) & 0x07ff) ); else *poutbuf++ = ( 0xf800 | ((ui >> 20) & 0x07ff) ); } return TRUE; } */ // // // char app03_MIA_DBLtoUSHORT(double *pf_inbuf, unsigned short *pus_outbuf, unsigned int len) { int i; //共用体 union { double d;//1(sign) + 11(exponent) + 52(fraction) unsigned char uc[8]; } un_dat; for(i = 0; i < len; i++){ un_dat.d = *pf_inbuf++; //1(sign) + 5(exponent) + 10(fraction) //USHORT側は2Bで対応するため、エンディアンに自動的に従う。 //DBL側は1Bずつ処理をするため、エンディアンを意識した処理をする。 if (un_dat.d > 65504) *pus_outbuf++ = 0x7c00; //+無限大 else if (un_dat.d < -65504) *pus_outbuf++ = 0xfc00; //-無限大 else if (un_dat.d > -6.10352e-5 && un_dat.d < 6.10352e-5) *pus_outbuf++ = 0x0000; //0 else { //DPU上ではBIG ENDIANが使用される #ifdef _RUN_ON_WINDOWS_ //LITTLE ENDIAN *pus_outbuf++ = ((un_dat.uc[7] & 0xc0) << 8) | (un_dat.uc[6] << 6) //正規化数 | ((un_dat.uc[5] >> 2) & 0x3f); #else //BIG ENDIAN *pus_outbuf++ = ((un_dat.uc[0] & 0xc0) << 8) | (un_dat.uc[1] << 6) //正規化数 | ((un_dat.uc[2] >> 2) & 0x3f); #endif } } return TRUE; }