//2013.10.25 /******************************************************************************* * モジュール名称 :APP03 Mission TLM (L&M) PI tasks * * モジュールラベル :app03_PIs * * タスク区分 :Application-03 MSA task for Mission TLM (L&M) * * 機能 : * * コーリングシーケンス:void app03_(PI) * * 引数 :なし * * 戻り値 :なし * * 使用上の注意 :グローバル変数はアプリケーション01でまとめて初期化 * * エラー処理 :なし * * 注意 : EDIT権限は、MPPE/MSA組 * * 作成日・作成者 :2012/12/19 Y.K. * *******************************************************************************/ #include "app_common.h" #include "app_MPPE-MIA.h" #include "app_MPPE-MSA.h" #include "app_comp_rice.h" // *** Macro - Local *** //char app03_MSA_readPacket(int, unsigned char*); char app03_MSA_makeL(unsigned char*); char app03_MSA_makeM(unsigned char*); char app03_MSA_TLM_LM(unsigned char, unsigned short*, unsigned char*, unsigned short*, unsigned char*, unsigned short*, unsigned char*); void app03_MSA( unsigned int ui_sunpulseCnt ) { int i, j; int i_flag; unsigned short us_lngP, us_len; unsigned char *puc_Ldat, *puc_Mdat; unsigned char uc_se_mode; unsigned short us_Llen, us_Mlen; // // === BLOCK read === int i_bufId; // Buffer ID *** int i_numNewBlock; // 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_datID; //データID(L:0x10, M:1-5; H: 0) struct _s_MSA_CtrlParam *pCtrl; //制御用のフラグ及びパラメータ struct _s_MSA_Product *pDat; pCtrl = &Gst_MSA_ctrl; pDat = &Gst_MSA_dat; puc_Ldat = G03uc_data; //(unsigned char*)Gus_MPPE_Ldata; puc_Mdat = G03uc_data + 8192; uc_se_mode = pCtrl->uc_eng_sci*2 + (pCtrl->uc_mode << 2 & 0x3c); //DEBUG #ifdef _GET_WORKING_TIME_MSA__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 // ----------------------------------------------------------- // -- Set at the buffer with the oldest non-processed block -- // ----------------------------------------------------------- i_bufId = app_CheckNonProcBlock ( Gd_N_MSA, 0, // [INPUT] Node/Data ID Gui_TLMm_blockTime[Gd_N_MSA], // [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_MSA, 0, // [INPUT] Node/Data ID i_bufId, // [INPUT] Buffer ID Gui_TLMm_blockTime[Gd_N_MSA], // [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_MSA] = ui_timeData; // === shift to newest data for SKIP === return; } if ( i_numNewBlock > 12) i_numNewBlock = 12; //Max. 3 spins //パケット読み込み制御パラメータ初期化 us_Llen = 0; us_Mlen = 0; us_lngP = 0; // --------------------- // -- Read Block data -- // --------------------- for (i=0; i Gui_TLMm_blockTime[Gd_N_MSA] && // NEW data t_blockInfo.i_replyNum > 0 && // Data available t_blockInfo.c_invalidFlg == 0 ) { // Data correct //### SHARED DATA //HK(20B)からApp02にて取得 j = app_tiTrgSearch(Gui_TLMm_blockTime[Gd_N_MSA]*16, Gd_N_MSA ); if (j) Gc_TRG1_MSA_HIon[j] = pCtrl->uc_Hmode_trg; // CHECK //memcpy( &(Gst_MSA_cmd.uc_ans[0]), &(Gc_TRG1_MSA_HIon[Gd_TRG_CALC]), 4); for (j = pCtrl->j_rec; j < 34; ++j) { //64Bのみ取得 i_flag = app_GetPacket( 3, // [INPUT] App-No:3 Gd_N_MSA, 0, // [INPUT] Node/Data ID i_bufId, // [INPUT] Buffer ID &t_blockInfo, // [INPUT] Block Info j, // [INPUT] Packet No (先頭:0) 0, // [INPUT] OFFSET読出開始番地(8の倍数) 64, // [INPUT] 読出データ数: G03uc_packet ); // [OUTPUT] 1 Block Data - copied if ( i_flag ) continue; // // Debug用、各パケットの先頭16Bだけ抜粋 // //memcpy(G03uc_data + 16*j, G03uc_packet + 12, 16); //Gui_TLMm_blockTime[Gd_N_MSA] = t_blockInfo.ui_createTime; //continue; // // //FrameID uc_datID = G03uc_packet[d_Lcl_MSA_DAT_ADRR]; if (uc_datID == 0xee || uc_datID == 0x00) continue;//ダミー, Hモードはスキップ us_len = app03_MSA_GetPcktLen(G03uc_packet + 12); //データ長取得 //短いパケットの場合、パケット全てを読まない //長い場合はパケット全て取得 多くの場合1024kB if (us_len + 12 > 64) { i_flag = app_GetPacket( 3, // [INPUT] App-No:3 Gd_N_MSA, 0, // [INPUT] Node/Data ID i_bufId, // [INPUT] Buffer ID &t_blockInfo, // [INPUT] Block Info j, // [INPUT] Packet No (先頭:0) 0, // [INPUT] OFFSET読出開始番地(8の倍数) d_Lcl_MSA_PAC_SIZE, // [INPUT] 読出データ数: G03uc_packet ); // [OUTPUT] 1 Block Data - copied if ( i_flag ) continue; us_len = app03_MSA_GetPcktLen(G03uc_packet + 12); //データ長取得 } //データ配置 if (uc_datID == 0x10) { //L mode memcpy(puc_Ldat + us_Llen, G03uc_packet + 12, us_len); us_Llen += us_len; } else if (uc_datID <= 6 && uc_datID >= 1) {//M mode //adding Mode #6 at April 2013 memcpy(puc_Mdat + us_Mlen, G03uc_packet + 12, us_len); us_Mlen += us_len; } //最大長に達した場合はここまでをTLMにして終了 if (us_Llen > 6600 || us_Mlen > 6600) { if (us_lngP++ < pCtrl->uc_LMlm) { //1-2回目は一旦TLM送信 //TLM送信 app03_MSA_TLM_LM(uc_se_mode, //Comment2 &us_Mlen, // データ長 TLMの場合は0にリセット puc_Mdat, //Mプロダクト &(pDat->us_Llen_ttl), // データ長 TLMの場合は0にリセット pDat->uc_Ldata, // Lプロダクト &us_Llen, // データ長 TLMの場合は0にリセット puc_Ldat); //Lプロダクト } else { //pCtrl->uc_LMlm 回目はTLM送信後、処理終了 pCtrl->j_rec = j + 1; break; } } } //34thパケット読み込み終了後 //次回はこのTI直後のブロックから走査する if (j == 34 || pCtrl->j_rec == 34) { Gui_TLMm_blockTime[Gd_N_MSA] = t_blockInfo.ui_createTime; pCtrl->j_rec = 0; } //L or M modeでプロダクトが最大長に達した場合は //次のブロックに移動せずに終了する if (us_lngP) break; // //Debug // //pDat->us_Llen = 16*34; //app03_MSA_tlmout(G03uc_data, // [INPUT]プロダクト // 0); // [INPUT]L-mode data flag } // To next block i_flag = app_NextBlock( Gd_N_MSA, 0, // [INPUT] Node/Data ID i_bufId, // [INPUT] Buffer ID &t_blockInfo); // [OUTPUT] Block Info if ( i_flag ) break; // no data } //TLM送信 app03_MSA_TLM_LM(uc_se_mode, //Comment2 &us_Mlen, // データ長 TLMの場合は0にリセット puc_Mdat, //Mプロダクト &(pDat->us_Llen_ttl), // データ長 TLMの場合は0にリセット pDat->uc_Ldata, // Lプロダクト &us_Llen, // データ長 TLMの場合は0にリセット puc_Ldat); //Lプロダクト //DEBUG #ifdef _GET_WORKING_TIME_MSA__03 dpu_getTime( &t_timeInfo); ui_tmp2 = t_timeInfo.ui_currentTime2; ui_tmp3 = ui_tmp2 - ui_tmp1; memcpy(Gst_MSA_cmd.uc_ans, &ui_tmp3, 4); #endif return; } //TLM送信 char app03_MSA_TLM_LM(unsigned char uc_se_mode, //Comment2 unsigned short *pus_Mlen, // データ長 unsigned char *puc_Mdat, //Mプロダクト unsigned short *pus_Llen_ttl, // データ長 unsigned char *puc_Ldata_ttl, // Lプロダクト unsigned short *pus_Llen, // データ長 unsigned char *puc_Ldat) //Lプロダクト { unsigned int ui_TI; memcpy(&ui_TI, puc_Mdat, 4); //TI app03_MIA_tlmout(Gd_N_MSA, TRUE, //[INPUT] 圧縮: TRUE(しない) *pus_Mlen/2, //[INPUT] data長さ US換算 uc_se_mode, //[INPUT] Comment2 0, //[INPUT] Comment3 (unsigned short*)puc_Mdat, // [INPUT]プロダクト (unsigned short*)puc_Mdat, //[MID] 圧縮後バッファ:未使用 ui_TI, //[INPUT] TI 1); // [INPUT]M-mode data flag *pus_Mlen = 0; if (*pus_Llen_ttl > 2000) { memcpy(&ui_TI, puc_Ldata_ttl, 4); //TI app03_MIA_tlmout(Gd_N_MSA, TRUE, //[INPUT] 圧縮: TRUE(しない) *pus_Llen_ttl/2, //[INPUT] data長さ US換算 uc_se_mode, //[INPUT] Comment2 0, //[INPUT] Comment3 (unsigned short*)puc_Ldata_ttl, // [INPUT]プロダクト (unsigned short*)puc_Ldata_ttl, //[MID] 圧縮後バッファ:未使用 ui_TI, //[INPUT] TI 0); // [INPUT]L-mode data flag *pus_Llen_ttl = 0; } if (*pus_Llen > 1000) { memcpy(&ui_TI, puc_Ldat, 4); //TI app03_MIA_tlmout(Gd_N_MSA, TRUE, //[INPUT] 圧縮: TRUE(しない) *pus_Llen/2, //[INPUT] data長さ US換算 uc_se_mode, //[INPUT] Comment2 0, //[INPUT] Comment3 (unsigned short*)puc_Ldat, // [INPUT]プロダクト (unsigned short*)puc_Ldat, //[MID] 圧縮後バッファ:未使用 ui_TI, //[INPUT] TI 0); // [INPUT]L-mode data flag } else { memcpy(puc_Ldata_ttl + *pus_Llen_ttl, puc_Ldat, *pus_Llen); *pus_Llen_ttl += *pus_Llen; } *pus_Llen = 0; return TRUE; } unsigned short app03_MSA_GetPcktLen(unsigned char uc_dat[]) // [INPUT] Packet data // (return) Packet length { int i = 9; //TI(6B) + Type(1B) + Cnt(1B) + CRC(1B) int j; unsigned short us_len = 0; for (j = 0; j < 3; ++j) { if (i >= 1024) break; if (uc_dat[i] == 0xfa || //SCI 1st uc_dat[i] == 0xfb) i += 256*uc_dat[i+1] + uc_dat[i+2]; //SCI cont. else if (uc_dat[i] == 0xf1) i += 128; //COMHK+FULLHK else if (uc_dat[i] == 0xf0) i += 14; //MISHK else if (uc_dat[i] == 1 || //EVT post report 16 uc_dat[i] == 3 || //EVT progtrss report 16 uc_dat[i] == 12 || //EVT Memory error 22 uc_dat[i] == 13 || //EVT General errpr 22 uc_dat[i] == 14 ) i += uc_dat[i+1]; //EVT CMD error 14 else if (uc_dat[i] >= 20 && uc_dat[i] <= 199) i += uc_dat[i+1]; //EVT UDP, .. OCL program else if (uc_dat[i] == 254 ) i += 12; //EVT Memory check report else break; } if (i > 1024) i = 1024; us_len = i; return (us_len); } /* char app03_MSA_tlmout( unsigned char *puc_inbuf, //[INPUT] 圧縮前のプロダクト unsigned char uc_lmhflg) //[INPUT] フラグ、0:L, 1: M, 4-9:H(DR-IDにそのまま使う) { unsigned char uc_cmp; // rev by YK 121219 int i; unsigned char uc_drid, uc_pacId; unsigned short us_length; unsigned char uc_appID, uc_cmnt[8]; unsigned int ui_TI; struct _s_MSA_Product *pDat; //プロダクト struct _s_MSA_CtrlParam *pCtrl; //制御用のフラグ及びパラメータ pDat = &Gst_MSA_dat; pCtrl = &Gst_MSA_ctrl; 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; //L mode else if (uc_lmhflg == 1) us_length = pDat->us_Mlen; //M mode else us_length = pDat->us_Hlen; //H mode //データ長が0の場合は何も作成しない if (us_length == 0) return FALSE; //TI memcpy(&ui_TI, puc_inbuf, 4); if (uc_appID!=3) uc_cmp = Guc_TLMh_cmp[Gd_N_MSA]; // rev. 121219 else uc_cmp = Guc_TLMm_cmp[Gd_N_MSA]; // rev. 121219 // Guc_TLMm_cmp[Gd_N_MSA] = 3; // rev. 121219 // uc_cmp = 3; uc_pacId = *(puc_inbuf + 7); //コメント uc_cmnt[0] = d_Lcl_MSA_TLMID0; uc_cmnt[1] = d_Lcl_MSA_TLMID1; uc_cmnt[2] = (pCtrl->uc_eng_sci << 1 & 0x02) + (pCtrl->uc_mode << 2 & 0x3c);//Hmodeでは無意味 uc_cmnt[3] = 0; uc_cmnt[4] = us_length >> 8 & 0xff; //データサイズ: uc_cmnt[5] = us_length & 0xff; uc_cmnt[6] = uc_cmnt[4]; uc_cmnt[7] = uc_cmnt[5]; //DEBUG #ifdef _GET_WORKING_TIME_MSA__03 uc_cmnt[2] = Gst_MSA_cmd.uc_ans[2]; uc_cmnt[3] = Gst_MSA_cmd.uc_ans[3]; #endif i = app_PutTlm( uc_appID, // [INPUT] APP-NUM = 3 or 5 Gd_N_MSA, // [INPUT] Node-ID 0, // [INPUT] Data-ID Gd_N_MSA, // [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:Arith0 2:Arith1 3:User 4:Rice] // *** rev. 121219 // 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 >>>> 8, // [INPUT] Comment - Size <<<< USER-DEF: <128B >>>> puc_inbuf, // [INPUT]**Data <<<< USER-DEF: <0x1E00 >>>> (int)us_length); // [INPUT]**Data - Size <<<< USER-DEF: <0x1E00 >>>> return TRUE; } */