/******************************************************************************* * モジュール名称 :app14 Mission TLM (L&M) PI tasks * * モジュールラベル :app14_PIs * * タスク区分 :Application-14 EWO task for Mission TLM (L&M) * * 機能 : * * コーリングシーケンス:void app14_(PI) * * 引数 :なし * * 戻り値 :なし * * 使用上の注意 :グローバル変数はアプリケーション01でまとめて初期化 * * エラー処理 :なし * * 注意 : EDIT権限は、EWO組 * * 作成日・作成者 :2014/09/09 T. Imachi * *******************************************************************************/ #define __APP_WFC_OFA__ #define __APP_WFC_AM2P__ #include "app_core.h" #include "app_common.h" #include "app_EWO.h" #include "dpu_api_proto.h" #define BITRATE_L 2 #define BITRATE_M 3 #define BITRATE_H 4 #define WFCE 0 #define WFCB 3 // 関数プロトタイプ void app14_WFC_VL( unsigned char ); void app14_WFC_ISDM(); void app14_EWO_putTLM( unsigned int, unsigned int, int, unsigned int, int, unsigned char *, int); // ***Prototype: app14_EWO-MDM.c*** void app14_EWO_MDM(); // メイン関数 void app14_EWO_WFC( unsigned int ui_sunpulseCnt ) { // static unsigned int ui_WFC_VL_time; // static unsigned int ui_ISDM_time; // M_T_TIME_INFO t_timeInfo; // ============================================================= // WFC VL // ============================================================= // 定期実行用カウンタ更新 G14ui_WFC_VL_counter++; if( G14ui_WFC_VL_counter > 0xffff ) G14ui_WFC_VL_counter = 0xffff; // AM2P か CAL が動いている時は,終わるまで待つ if( G14uc_AM2P_stage == 0 && G14uc_WFC_CAL_stage == 0 ){ // 定期実行 if( G14uc_WFC_VL_stage == 0xff ){ // NOP if( G14ui_WFC_VL_interval == 0x00 ){ // return; } // 強制実行 else if( G14ui_WFC_VL_interval == 0xffff ){ G14ui_WFC_VL_counter = 0; // カウンタリセット G14uc_WFC_VL_stage = 0; // WFC-B VL G14ui_WFC_VL_interval = 0; // 次回 NOP } // 定期実行 else{ if( G14ui_WFC_VL_counter >= G14ui_WFC_VL_interval ){ G14ui_WFC_VL_counter = 0; // カウンタリセット G14uc_WFC_VL_stage = 0; // WFC-B VL } else{ // return; } } } // WFC-B VL if( G14uc_WFC_VL_stage == 0 ){ Gui_EWO_WFC_VL_blockTime = Gui_EWO_WFCB_blockTime; if( G14uc_WFCB_VL_ch > 0 && G14uc_WFCB_VL_ch < 8 ){ // OFA-B VL // *******TIME management:TMP********** // dpu_getTime(&t_timeInfo); // ui_WFC_VL_time = t_timeInfo.ui_currentTime; // *******TIME management:TMP********** app14_WFC_VL( WFCB ); // *******TIME management:TMP********** // dpu_getTime(&t_timeInfo); // ui_WFC_VL_time = t_timeInfo.ui_currentTime - ui_WFC_VL_time; // *******TIME management:TMP********** } // ステージ更新 G14uc_WFC_VL_stage = 1; // WFC-E VL } // WFC-E VL else if( G14uc_WFC_VL_stage == 1 ){ if( G14uc_WFCE_VL_ch > 0 && G14uc_WFCE_VL_ch < 4 ){ // OFA-B VL app14_WFC_VL( WFCE ); // 処理終了後,WFC-E VL を非アクティブに // G14uc_WFCE_VL_ch = 0; // ステージ更新 } G14uc_WFC_VL_stage = 0xff; // NOP if( Guc_WFC_VL_cnt == 0xff ) Guc_WFC_VL_cnt = 0; else Guc_WFC_VL_cnt++; } } #ifndef _APP_RDN_ // ============================================================= // ISDM // ============================================================= // AM2P か CAL か WFC VL が動いている時は,終わるまで待つ if( G14uc_AM2P_stage == 0 && G14uc_WFC_CAL_stage == 0 && G14uc_WFC_VL_stage == 0xff ){ // 定期実行用カウンタ更新 G14ui_ISDM_counter++; if( G14ui_ISDM_counter > 0xffff ) G14ui_ISDM_counter = 0xffff; // 定期実行 // NOP if( G14ui_ISDM_interval == 0x00 ){ // return; } // #ifndef _APP_RDN_ // 強制実行 else if( G14ui_ISDM_interval == 0xffff ){ G14ui_ISDM_counter = 0; // カウンタリセット // *******時間計測用:TMP-START********** // dpu_getTime(&t_timeInfo); // ui_ISDM_time = (t_timeInfo.ui_currentTime); // unsigned int ui_currentTime; 衛星時刻(1LSB=1.953ms) // *******TIME management:TMP-END********** app14_WFC_ISDM(); // *******TIME management:TMP********** // dpu_getTime(&t_timeInfo); // ui_ISDM_time = t_timeInfo.ui_currentTime - ui_ISDM_time; // *******TIME management:TMP********** G14ui_ISDM_interval = 0; // 次回 NOP } // 定期実行 else{ if( G14ui_ISDM_counter >= G14ui_ISDM_interval ){ G14ui_ISDM_counter = 0; // カウンタリセット // *******時間計測用:TMP-START********** // dpu_getTime(&t_timeInfo); // ui_ISDM_time = (t_timeInfo.ui_currentTime); // unsigned int ui_currentTime; 衛星時刻(1LSB=1.953ms) // *******TIME management:TMP-END********** app14_WFC_ISDM(); // *******TIME management:TMP********** // dpu_getTime(&t_timeInfo); // ui_ISDM_time = t_timeInfo.ui_currentTime - ui_ISDM_time; // *******TIME management:TMP********** } else{ // return; } } // #endif // _APP_RDN_ } // ============================================================= // EWO-MDM // ============================================================= app14_EWO_MDM(); #endif // _APP_RDN_ } /* end of app14_EWO_WFC */ // ============================================================= // WFC VL // ============================================================= // フィルタタップにより減少するデータ点数 // 31 * 32 + 150 = 1142 (1/2filter:31, 1/32filter:150) //#define N_FLT 1142 // 25 * 32 + 156 = 956 (1/2filter:25, 1/32filter:156) #define N_FLT 956 void app14_WFC_VL( unsigned char uc_eb ){ int i_bufId; // Buffer ID int i_numNewBlock; // Number of blocks with new data unsigned int ui_timeData; // Processing data TI M_T_BLOCK_INFO t_blockInfo; // **** M_T_BLOCK_INFO メンバ ***** // unsigned int ui_createTime Block 生成開始衛星時刻 (LSB=31.25ms) // int i_replyNum Block 登録 read-reply 個数 // char c_invalidFlg Block 内データ異常の有無 (0:異常なし, 1:異常あり) // unsinged int ui_blockIndex LongBuffer/ShortBuffer 内 Block 特定番号 // ******************************** // WFC-E, WFC-B 選択 unsigned int ui_ewo_dataId; unsigned int ui_ewo_headId; unsigned int ui_ewo_packet_size; unsigned char uc_ewo_data_spec; unsigned char uc_WFC_VL_ch; // === Data === int i_dataId; // EWOB-Header :: DataID int i_dataSize; // EWOB-Header :: Data Size unsigned int ui_TI1; unsigned int ui_TI2; int i_num_packet; // int i_num_data; // 読み出したデータの数 int i_num_read; int i_num_skip; int i_nReadPacket; int i_nPacketData; int i_pos_r; int i_pos_w; int i_nFiltered; int i_pos_w_sig; int i_nCh; // チャンネル数 E:2, B:3 int i_nFFT; int i_nSpec; double f_re, f_im; int i_re, i_im; // General int i, j, k, l, m; int i_flag; // WFC-E, WFC-B 選択 if( uc_eb == WFCE ){ ui_ewo_dataId = Gd_D_EWOE; ui_ewo_headId = Gd_N_EWOE; ui_ewo_packet_size = Gd_Pac_EWOE; uc_ewo_data_spec = 0x0f; uc_WFC_VL_ch = G14uc_WFCE_VL_ch; i_nCh = 2; } else{ ui_ewo_dataId = Gd_D_EWOB; ui_ewo_headId = Gd_N_EWOB; ui_ewo_packet_size = Gd_Pac_EWOB; uc_ewo_data_spec = 0x3f; uc_WFC_VL_ch = G14uc_WFCB_VL_ch; i_nCh = 3; } // -- Set at the buffer with the oldest non-processed block -- // 未処理ブロックの Buffer-ID を求める. // i_bufId には Buffer-ID (0:Long, 1:Short, -1:no data) が返る. i_bufId = app_CheckNonProcBlock( Gd_N_EWO, ui_ewo_dataId, // [INPUT] Node/Data ID Gui_EWO_WFC_VL_blockTime, // [INPUT] TI of Processed Block (E, B ともに B の時刻を使う) &ui_timeData // [OUTPUT] TI of Newest Block in the selected buffer ); // i_bufId が no data の場合,処理はここで終了. if( i_bufId < 0 ) return; // -- Set at the oldest non-processed block -- // 未処理ブロック数を求める. // i_numNewBlock にブロック数が返る.負の数が返った場合はデータ無し(エラー) // i_numNewBlock = app_SetNonProcBlock( // Gd_N_EWO, ui_ewo_dataId, // [INPUT] Node/Data ID // i_bufId, // [INPUT] Buffer ID // Gui_EWO_WFCB_blockTime, // [INPUT] IT of Processed Block // &t_blockInfo // [OUTPUT] Block info // ); i_numNewBlock = app_SetNonProcBlock( Gd_N_EWO, ui_ewo_dataId, // [INPUT] Node/Data ID i_bufId, // [INPUT] Buffer ID Gui_EWO_WFC_VL_blockTime, // [INPUT] IT of Processed Block // 2014.09.03 T.Imachi &t_blockInfo // [OUTPUT] Block info ); // 未処理ブロックが一つも無い場合,i_bufId と共に求めたブロックの最新TIを, // 次回参照される処理済みブロックTIとして上書きして終了. if( i_numNewBlock < 1 ){ // Gui_EWO_WFCB_blockTime = ui_timeData; return; } // データ読み出し i_num_skip = 0; i_num_read = 4; // 4 packet = 3072 * 4 bytes ( 2048 points * 2 byte * 3 ch ); // 各未処理ブロックごとに処理する -> 先頭のブロックのみ処理 // 2014.09.03 Imachi // for( i=0; i Gui_EWO_WFCB_blockTime && // <- BlockTime 要修正 // t_blockInfo.i_replyNum > 0 && // t_blockInfo.c_invalidFlg == 0 ){ if( t_blockInfo.ui_createTime > Gui_EWO_WFC_VL_blockTime&& // 2014.09.03 Imachi t_blockInfo.i_replyNum > 0 && t_blockInfo.c_invalidFlg == 0 ){ // // 最後の1ブロックだけを処理 // 2014.09.03 Imachi // if( i < i_numNewBlock - 1 ){ // i_flag = app_NextBlock( // Gd_N_EWO, ui_ewo_dataId, // [INPUT] Node/Data ID // i_bufId, // [INPUT] Buffer ID // &t_blockInfo // [OUTPUT] Block info // ); // // 最後の1ブロックでなければ,読み飛ばす. // if( i_flag != 0 ) break; // else continue; // } // ここから最後の1ブロックについての処理 // Gui_EWO_WFCB_blockTime = t_blockInfo.ui_createTime; // <- BlockTime ***** 更新不要 // 各パケット毎の処理 i_num_packet = t_blockInfo.i_replyNum; // ----------------------- // -- パケットヘッダの取得 -- // ----------------------- i_flag = app_GetPacket( 14, // [INPUT] App-No.: 14 Gd_N_EWO, ui_ewo_dataId, // [INPUT] Node/Data ID i_bufId, // [INPUT] Buffer ID &t_blockInfo, // [INPUT] Block info 0, // [INPUT] Packet No. (0:先頭) 0, // [INPUT] OFFSET 読み出し開始番地 32, // [INPUT] 読み出しデータ長 G14uc_data // [OUTPUT] 読み出しデータ収納バッファ ); // // if( i_flag != 0 ) break; // 2014.09.03 Imachi if( i_flag != 0 ) return; // -------------------------- // -- Decode Packet Header -- // -------------------------- // DataID の取得 // EWO-Header::DataID (EWO-Head::B6-7) i_dataId = G14uc_data[22]; if( i_dataId == 0x30 ){ i_nFFT = 256; i_nPacketData = 128; // 1パケットあたりのデータ点数 i_nSpec = 32; } else{ i_nFFT = 1024; i_nPacketData = 512; // 1パケットあたりのデータ点数 i_nSpec = 32; } // DataSize の取得 // EWO-Header::DataSize (EWO-Head::B8-9) i_dataSize = ( G14uc_data[24] << 8 ) + G14uc_data[25]; // EWO-E TI の取得 // 下記の合計 // EWO-Head::B0-3: TI at SunPulse (LSB: 1.953ms) // EWO-Head::B4-5: Time after SunPulse (LSB: 122us) ui_TI1 = 0; for( k=16; k<=19; k++ ){ ui_TI1 <<= 8; ui_TI1 += G14uc_data[k]; } memcpy( &ui_TI2, &G14uc_data[20], 2 ); // 2014.03.24 T.Imachi // --------------------------------------------------------------- // 全チャンネルを 1024 FT // 1024 点は、1024 * 64 = 65536 点をダウンサンプリングして生成 // ダウンサンプリング処理は、8192 点(16 パケット)ずつを 8 回 // (8192 / 64 = 128.1024 / 128 = 8) // --------------------------------------------------------------- i_nReadPacket = 16; // パケット同時読み出し数 // チャンネル番号ループ for( j=0; j 32768 ) G14f_WFC_work[i_pos_w] -= 65536; i_pos_w++; } // データ点番号ループ (m) } // パケット番号ループ (l) //---------------------------------------------------------- // ダウンサンプリング //---------------------------------------------------------- // 1/32 -> 1/2 // i_pos_w には書き込まれたデータの点数 - 1 が入っている i_nFiltered = app_EWO_decimation_32( G14f_WFC_work, i_pos_w + 1, G14f_EWO_DEC_work, 32 ); // 1/2 :: 251 -> 0x6e = 110 ( = 128 - 18 ) :: 18 * 2 = 36 // i_nFiltered = app_EWO_decimation_2( G14f_WFC_work, i_nFiltered, G14f_EWO_DEC_work, 2 ); i_nFiltered = app_EWO_decimation_2_2( G14f_WFC_work, i_nFiltered, G14f_EWO_DEC_work, 2 ); // 波形(処理後)バッファへ格納 if( j==0 ){ // E1 or Bx for( l=0; l> 8 ) & 0xff ); G14uc_packet[1] = (unsigned char)( ui_TI2 & 0xff ); G14uc_packet[2] = (unsigned char)( ( G13ui_EWO_spin_period >> 8 ) & 0xff ); G14uc_packet[3] = (unsigned char)( G13ui_EWO_spin_period & 0xff ); G14uc_packet[4] = j; if( uc_eb == WFCE ) G14uc_packet[5] = 0x0e; else G14uc_packet[5] = 0x3e; i_pos_w = 6; // 波形データ for( k=0; k> 8 ) & 0xff ); G14uc_packet[i_pos_w++] = ( (int)G14f_WFC_X_org[k] & 0xff ); } for( k=0; k> 8 ) & 0xff ); G14uc_packet[i_pos_w++] = ( (int)G14f_WFC_Y_org[k] & 0xff ); } if( uc_eb == WFCB ){ for( k=0; k> 8 ) & 0xff ); G14uc_packet[i_pos_w++] = ( (int)G14f_WFC_Z_org[k] & 0xff ); } } // 出力 app14_EWO_putTLM( ui_ewo_dataId, // [INPUT] Data ID ui_ewo_headId, // [INPUT] Header ID i_dataId, // [INPUT] Packet-ID 0x11or0x31:HF, 0x10or0x11:LF ui_TI1, // [INPUT] TI BITRATE_M, // [INPUT] M-mode data G14uc_packet, // [INPUT] Packet data i_pos_w // [INPUT] Packet size ); } } //---------------------------------------------------------- // L-mode data //---------------------------------------------------------- if( ( uc_eb == WFCE && G14uc_WFCE_VL_L_ena != 0 ) // 2013.12.17 T.Imachi || ( uc_eb == WFCB && G14uc_WFCB_VL_L_ena != 0 ) // 2013.12.17 T.Imachi ){ //---------------------------------------------------------- // 周波数スペクトル生成 //---------------------------------------------------------- //---------------------------------------------------------- // FFT //---------------------------------------------------------- // E1, E2 もしくは Bx, By を同時 FFT app_EWO_rfft_dual14( i_nFFT, G14f_WFC_X_org, G14f_WFC_X_spec_re, G14f_WFC_X_spec_im, G14f_WFC_Y_org, G14f_WFC_Y_spec_re, G14f_WFC_Y_spec_im ); /* for( j=0; j> 8 ) & 0xff ); G14uc_packet[1] = (unsigned char)( ui_TI2 & 0xff ); G14uc_packet[2] = (unsigned char)( ( G13ui_EWO_spin_period >> 8 ) & 0xff ); G14uc_packet[3] = (unsigned char)( G13ui_EWO_spin_period & 0xff ); G14uc_packet[4] = j; if( uc_eb == WFCE ) G14uc_packet[5] = 0x0f; else G14uc_packet[5] = 0x3f; i_pos_w = 6; //---------------------------------------------------------- // スペクトルデータ //---------------------------------------------------------- // チャンネル番号ループ for( j=0; j short i_re = (int)( f_re * 4 ); i_im = (int)( f_im * 4 ); // テレメトリパケットに格納 G14uc_packet[i_pos_w++] = (unsigned char)( ( i_re >> 16 ) & 0xff ); G14uc_packet[i_pos_w++] = (unsigned char)( ( i_re >> 8 ) & 0xff ); G14uc_packet[i_pos_w++] = (unsigned char)( i_re & 0xff ); G14uc_packet[i_pos_w++] = (unsigned char)( ( i_im >> 16 ) & 0xff ); G14uc_packet[i_pos_w++] = (unsigned char)( ( i_im >> 8 ) & 0xff ); G14uc_packet[i_pos_w++] = (unsigned char)( i_im & 0xff ); } // スペクトル番号ループ (k) } // チャンネル番号ループ (j) //---------------------------------------------------------- // 出力 //---------------------------------------------------------- app14_EWO_putTLM( ui_ewo_dataId, // [INPUT] Data ID ui_ewo_headId, // [INPUT] Header ID i_dataId, // [INPUT] Packet-ID 0x11or0x31:HF, 0x10or0x11:LF ui_TI1, // [INPUT] TI BITRATE_L, // [INPUT] L-mode data G14uc_packet, // [INPUT] Packet data i_pos_w // [INPUT] Packet size ); } // L-mode ena } // ブロック検査条件分岐,ここまで // } // 各未処理ブロック毎の処理ループ,ここまで. } #ifndef _APP_RDN_ // =========================================================================== // app14_WFC_ISDM // =========================================================================== void app14_WFC_ISDM() { unsigned int ui_TIstart; int i_bufId; int i_numNewBlock; M_T_BLOCK_INFO t_blockInfo; unsigned int ui_TI1; unsigned int ui_TI2; int i_dataId; int i_nPacket_1spin; int i_num_offset; unsigned char uc_init; unsigned char uc_reset; struct G14_ISDM_event_str st_ISDM_event; int i_tlm_size_bak; double f_tmp; int i_flag; int i, j, k, l; // データサーチ ui_TIstart = Gui_TLMm_blockTime[Gd_N_EWOE]; // 最後に生成した L/M データの sun pulse 時刻を使用 i_numNewBlock = app_SetTlmHBlock( Gd_N_EWO, Gd_D_EWOE, // [INPUT] Node/Data ID ui_TIstart, // [INPUT] TI of Start Block [0x0000000: OLDEST 0xFFFFFFFF: NEWEST] &t_blockInfo); // [OUTPUT] Block Info *** // (return) >0:Num of blocks, <=0:No data (error) *** if ( i_numNewBlock < 1 ) return; // No data i_bufId = 0; // Long buffer // 1 スピンあたりのパケット数を計算(スピン周期 * サンプリング周波数 / 1パケットのデータ点数) i_nPacket_1spin = G13f_EWOE_spin_period * 65536 / 512; // 先頭 1/8 spin (45deg) を読み飛ばす. i_num_offset = i_nPacket_1spin / 8; // データパケットを取得する i_flag = app_GetPacket( 14, // [INPUT] App-No.: 14 Gd_N_EWO, Gd_D_EWOE, // [INPUT] Node/Data ID i_bufId, // [INPUT] Buffer ID &t_blockInfo, // [INPUT] Block info i_num_offset, // [INPUT] Packet No. (0:先頭) 0, // [INPUT] OFFSET 読み出し開始番地 Gd_Pac_EWOE * 16, // [INPUT] 読み出しデータ長 (8 packets) G14uc_data // [OUTPUT] 読み出しデータ収納バッファ ); // Data ID i_dataId = G14uc_data[22]; // Sun pulse TI の取得 // EWO-Head::B0-3: TI at SunPulse (LSB: 1.953ms) memcpy( &ui_TI1, &G14uc_data[16], 4 ); // EWO-Head::B4-5: EWO counter (LSB: 122us) memcpy( &ui_TI2, &G14uc_data[20], 2 ); /* // テレメトリパケット生成 if( G14uc_ISDM_tlm_size == 0 ){ G14uc_ISDM_tlm[5] = 0x0d; G14uc_ISDM_tlm_size = 6; } */ G14uc_ISDM_result_size = 0; // 512点(1パケット)ずつ FFT(256点 スペクトル化) for( j=0; j<16; j++ ){ // 16 packets // データパケットを成分分割 l = Gd_Pac_EWOE * j; for( k=0; k<2048; k+=4 ){ // 連続する2バイトずつを,1データとして収納 G14f_WFC_X_org[k/4] = (double)( (int)( G14uc_data[k + l + 26] << 8 ) + (int)G14uc_data[k + l + 27] ); G14f_WFC_Y_org[k/4] = (double)( (int)( G14uc_data[k + l + 28] << 8 ) + (int)G14uc_data[k + l + 29] ); // unsigned を signed に変換 if( G14f_WFC_X_org[k/4] >= 32768 ) G14f_WFC_X_org[k/4] -= 65536; if( G14f_WFC_Y_org[k/4] >= 32768 ) G14f_WFC_Y_org[k/4] -= 65536; } // Hanning 窓を適用(結果格納バッファには G14f_WFC_Z_org を転用) if( G13uc_WFCE_L_channel != 0x02 ) app_EWO_Hanning( G14f_WFC_X_org, G14f_WFC_Z_org, 512 ); else app_EWO_Hanning( G14f_WFC_Y_org, G14f_WFC_Z_org, 512 ); /* //----------------------------------------------------------------------------------- // 波形ダンプ ---- for test ---- i_tlm_size_bak = G14uc_ISDM_tlm_size; // テレメトリサイズをバックアップ for( k=0; k<512; k++ ){ G14uc_ISDM_tlm[k*2 + 6] = (unsigned char)( ( ( (short)G14f_WFC_Z_org[k] ) >> 8 ) & 0xff ); G14uc_ISDM_tlm[k*2 + 7] = (unsigned char)( ( (short)G14f_WFC_Z_org[k] ) & 0xff ); } app14_EWO_putTLM( Gd_D_EWOE, // [INPUT] Data ID Gd_N_EWOE, // [INPUT] Header ID i_dataId, // [INPUT] Packet-ID 0x11or0x31:HF, 0x10or0x11:LF ui_TI1, // [INPUT] TI BITRATE_M, // [INPUT] M-mode data G14uc_ISDM_tlm, // [INPUT] Packet data 512 * 2 + 6 + 1 // [INPUT] Packet size ); G14uc_ISDM_tlm_size = i_tlm_size_bak; // テレメトリサイズを戻す //----------------------------------------------------------------------------------- */ // FFT (結果はチャンネルによらず G14f_WFC_X_spec に収納) app_EWO_rfft14( G14f_WFC_Z_org, 512, G14f_WFC_X_spec_re, G14f_WFC_X_spec_im ); // パワースペクトルの計算 for( k=0; k<256; k++ ){ G14us_WFC_ISDM_spec[k] = 100 * app_math_sqrt( G14f_WFC_X_spec_re[k] * G14f_WFC_X_spec_re[k] + G14f_WFC_X_spec_im[k] * G14f_WFC_X_spec_im[k] ) / 512; } //----------------------------------------------------------------------------------- // スペクトルダンプ // 2013.11.18 T.Imachi if( G14uc_ISDM_dump_ena != 0 ){ i_tlm_size_bak = G14uc_ISDM_tlm_size; // テレメトリサイズをバックアップ memcpy( &G14uc_ISDM_tlm[0], &G14uc_data[l + 20], 3 ); // EWO counter (2byte) + dataID (1byte) // 2013.12.17 T.Imachi G14uc_ISDM_tlm[5] = 0x0c; // SPEC = 0x0c for( i=0; i<256; i++ ){ f_tmp = app_math_log10( (double)G14us_WFC_ISDM_spec[i] ) * 20; if( f_tmp < 0 ) f_tmp = 0; if( f_tmp > 127 ) f_tmp = 127; if( f_tmp < -128 ) f_tmp = -128; G14uc_ISDM_tlm[i+6] = (unsigned char)( ( (int)f_tmp ) & 0xff ); } app14_EWO_putTLM( Gd_D_EWOE, // [INPUT] Data ID Gd_N_EWOE, // [INPUT] Header ID i_dataId, // [INPUT] Packet-ID 0x11or0x31:HF, 0x10or0x11:LF ui_TI1, // [INPUT] TI BITRATE_H, // [INPUT] DR は H0 を使用 // 2013.12.17 T.Imachi G14uc_ISDM_tlm, // [INPUT] Packet data 256 + 6 // [INPUT] Packet size ); G14uc_ISDM_tlm[5] = 0x0d; G14uc_ISDM_tlm_size = i_tlm_size_bak; // テレメトリサイズを戻す } //----------------------------------------------------------------------------------- // ISDM 解析 if( ( G14uc_ISDM_WPTP_gain == Guc_EWO_WPTP_gain ) && ( G14uc_ISDM_EWO_gain == Guc_EWOE_gain ) ) uc_reset = 0; else{ uc_reset = 1; G14uc_ISDM_WPTP_gain = Guc_EWO_WPTP_gain; G14uc_ISDM_EWO_gain = Guc_EWOE_gain; // **** revised by YK 121130 **** } if( G14uc_ISDM_init != 0 ){ uc_init = 1; G14uc_ISDM_init = 0; } else{ uc_init = 0; } if( G14uc_ISDM_reset != 0 ){ uc_reset = 1; G14uc_ISDM_reset = 0; } st_ISDM_event = app14_ISDM( ui_TI1, // Time G14us_WFC_ISDM_spec, // Spectrum uc_init, // 1:initialize uc_reset // 1:gain chanded ); // // ISDM event time // if( j==0 ){ // 2013.11.13 T.Imachi // for( i=0; i<4; i++ ) // G14uc_ISDM_result[G14uc_ISDM_result_size++] = (unsigned char)( ( st_ISDM_event.e_time >> ( i * 8 ) ) & 0xff ); // } // ISDM event types G14uc_ISDM_result[G14uc_ISDM_result_size++] = st_ISDM_event.Event; } // 16 packets // 出力 G14uc_ISDM_tlm_size = 0; memcpy( &G14uc_ISDM_tlm[0], &ui_TI1, 4 ); memcpy( &G14uc_ISDM_tlm[4], &ui_TI2, 2 ); G14uc_ISDM_tlm[6] = (unsigned char)( i_dataId & 0xff ); if( G14uc_ISDM_result_size > 1190 ) G14uc_ISDM_result_size = 1190; memcpy( &G14uc_ISDM_tlm[7], &G14uc_ISDM_result[0], G14uc_ISDM_result_size ); G14uc_ISDM_tlm_size = G14uc_ISDM_result_size + 7; /* // if( G14uc_ISDM_tlm_size > 900 ){ memcpy( &G14uc_ISDM_tlm[6], &G14uc_ISDM_result[0], G14uc_ISDM_result_size ); app14_EWO_putTLM( Gd_D_EWOE, // [INPUT] Data ID Gd_N_EWOE, // [INPUT] Header ID i_dataId, // [INPUT] Packet-ID 0x11or0x31:HF, 0x10or0x11:LF ui_TI1, // [INPUT] TI BITRATE_L, // [INPUT] L-mode data G14uc_ISDM_tlm, // [INPUT] Packet data G14uc_ISDM_result_size + 6 // [INPUT] Packet size ); G14uc_ISDM_tlm_size = 0; G14uc_ISDM_result_size = 0; // } */ if( Guc_ISDM_cnt == 0xff ) Guc_ISDM_cnt = 0; else Guc_ISDM_cnt++; } #endif // _APP_RDN_ // =========================================================================== // app14_EWOB_VL_putTLM // =========================================================================== void app14_EWO_putTLM( unsigned int ui_dataId, // [INPUT] Data ID unsigned int ui_headId, // [INPUT] Header ID int i_pacId, // [INPUT] Packet ID unsigned int ui_dataTi, // [INPUT] TI int i_drId, // [INPUT] DR-ID L/M/H0 (for CAT-ID) [0:HK 1:OS 2:L 3:M 4-9:H(0-5)] unsigned char uc_data[], // [INPUT] Data int i_dataSize) // [INPUT] Data Size (Byte) { int i_flag; unsigned char uc_comment[128]; unsigned char uc_commentSize = 0; // **** Non-COMP or JPEG-REV **** if ( Guc_TLMm_cmp[Gd_N_AM2P] ) Guc_TLMm_cmp[Gd_N_AM2P] = 1; i_flag = app_PutTlm( 14, // [INPUT] APP-NUM = 4 Gd_N_EWO, // [INPUT] Node-ID ui_dataId, // [INPUT] Data-ID ui_headId, // [INPUT] Header-ID (for PID-ID, CAT-ID setting) i_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_EWOE], // [INPUT] Comp mode [0:non 1:JPEG-rev 2:Math 3-7:After-User-COMP] i_pacId, // [INPUT] Packet ID <<<< USER-DEF: 0x00- 0xFF >>>> ui_dataTi, // [INPUT] Data TI <<<< USER-DEF: 0x00000000-0xFFFFFFFF >>>> uc_comment, // [INPUT] Comment <<<< USER-DEF: <128B >>>> uc_commentSize, // [INPUT] Comment - Size <<<< USER-DEF: <128B >>>> uc_data, // [INPUT] Data <<<< USER-DEF: <0x1E00 >>>> i_dataSize // [INPUT] Data - Size <<<< USER-DEF: <0x1E00 >>>> ); return; }