/******************************************************************************* * モジュール名称 :app13 Mission TLM (L&M) PI tasks * * モジュールラベル :app13_PIs * * タスク区分 :Application-03 EWO-EFD task for Mission TLM (L&M) * * 機能 : * * コーリングシーケンス:void app13_(PI) * * 引数 :なし * * 戻り値 :なし * * 使用上の注意 :グローバル変数はアプリケーション01でまとめて初期化 * * エラー処理 :なし * * 注意 : EDIT権限は、EWO組 * * 作成日・作成者 :2015/10/6 T.Imachi (H-dump flag) * *******************************************************************************/ #include "app_core.h" #include "app_EWO.h" #include "dpu_api_proto.h" /******************************************************************************* WFC header (L, M) + data 00 (0x00) Sun pulse TI 01 (0x01) Sun pulse TI 02 (0x02) Sun pulse TI 03 (0x03) Sun pulse TI 04 (0x04) EWO Count (= HB << 4 | LB >> 4) 05 (0x05) Spec 06 (0x06) Info0 07 (0x07) Info1 08 (0x08) Number of the data in each spectrum 09 (0x09) Number of the data in each spectrum 10 (0x0A) Data size 11 (0x0B) Data size 12 (0x0C) Data - WFC header : Info0 (L, M) b7 Bitrate 0x01:H, 0x02:L, 0x03:M b6 Bitrate b5 Time interval 0x00:1/0.5, 0x01:2/1, 0x02:4/2 (L/M) b4 Time interval b3 Sampling rate 0x00:LF, 0x01:HF b2 OFA Channel 0x00:|E|/|B|, 0x01:E1/Bx, 0x02:E2/By, 0x03:NA/Bz (E/B) b1 OFA Channel b0 CAL on/off 0x00:off, 0x01:on WFC header : Info1 (L, M) B7 None B6 None B5 None B4 None B3 None B2 Pre-Amp gain 0x00:L, 0x01:H B1 OFA/WFC gain 0x00:L/L, 0x01:ML/H, 0x02:MH/NA, 0x03:H/NA (E/B) B0 OFA/WFC gain *******************************************************************************/ //#define TLM_DATA_TOP 12 #define TLM_DATA_TOP 10 // ローカル関数プロトタイプ宣言 void app13_EWO_readHK(); void app13_OFA( unsigned char uc_OFA_EB, unsigned int ui_sunpulseCnt ); int app13_EWO_OFA_param_check( unsigned char *cur, // [INPUT/OUTPUT] 現在のパラメータ値 unsigned char new // [INPUT] 新しいパラメータ値 ); void app13_EWO_OFA_make_spectrum( unsigned char uc_OFA_EB, // [INPUT] OFA-E or OFA-B unsigned char *uc_data, // [INPUT] 入力データバッファ(関数中で上書き再利用あり) unsigned int ui_data_size, // [INPUT] 入力データの大きさ(Byte) unsigned char *uc_ofa_channel, // [INPUT] L,M1,M2 のチャンネル(0:ABS,1:X,2:Y,3:Z) unsigned char **uc_tlm_buf, // [INPUT/OUTPUT] テレメトリパケットバッファ int **i_tlm_size, // [INPUT/OUTPUT] テレメトリパケットバッファのサイズ unsigned char **uc_tlm_ready // [OUTPUT] Telemtry packet ready ); void app13_EWO_spectrum_reduce( double *f_buf, // [OUTPUT] データ出力バッファ double *f_re, // [INPUT] スペクトル実部の配列 double *f_im, // [INPUT] スペクトル虚部の配列 int i_data_length, // [INPUT] スペクトル点数 int *i_freq_table, // [INPUT] 平均化周波数テーブル int i_freq_table_length // [INPUT] 平均化周波数テーブル長 ); void app13_EWO_spectrum_dB( unsigned char *uc_buf, // [OUTPUT] 出力先バッファ double *f_data, // [INPUT] 元データ(スペクトル輝度の二乗値) int i_num_data, // [INPUT] 元データの数 int i_div // [INPUT] 除算値 ); void app13_EWO_OFA_make_tlm_header( EWO_PACKET_INFO *st_tlm_info1, // [INPUT] テレメトリ情報 EWO_PACKET_INFO *st_tlm_info2, // [INPUT] テレメトリ情報 unsigned int ui_spinrate, // [INPUT] Spin rate unsigned char uc_TI2, // [INPUT] EWO counter (reduced) int i_size, // [INPUT] テレメトリサイズ unsigned char *uc_buf // [OUTPUT] テレメトリパケットバッファ ); void app13_EWO_freq_table_init( int *i_freq_table, // 周波数テーブル先頭ポインタ int i_table_size_org, // 元々の周波数テーブルの点数 int i_table_size_out, // 生成する周波数テーブルの点数 double f_fmax_org, // 元々のテーブルの最大周波数 double f_fmax_out // 生成する周波数テーブルの最大周波数 ); void app13_EWO_AGC( unsigned int ui_sunpulseCnt, unsigned char uC_OFA_EB ); void app13_EWO_ISDM_table_dump(); // ---------------------------------------------------------------------------- /******************************************************************************* メイン関数 (EWO-E) *******************************************************************************/ void app13_EWOE( unsigned int ui_sunpulseCnt ) { app13_EWO_ISDM_table_dump(); G14uc_AM2P_ready = 1; G14uc_WFC_CAL_ready = 1; app13_EWO_readHK(); app13_OFA( Gd_EWO_OFA_E, ui_sunpulseCnt ); app13_EWO_AGC( ui_sunpulseCnt, Gd_EWO_OFA_E ); } /******************************************************************************* メイン関数 (EWO-B) *******************************************************************************/ void app13_EWOB( unsigned int ui_sunpulseCnt ) { app13_EWO_readHK(); app13_OFA( Gd_EWO_OFA_B, ui_sunpulseCnt ); app13_EWO_AGC( ui_sunpulseCnt, Gd_EWO_OFA_B ); } /******************************************************************************* EWO HK の読み込み *******************************************************************************/ void app13_EWO_readHK(){ unsigned char uc_HK[0x80]; unsigned char uc_WPTP_gain, uc_WFCE_gain, uc_WFCB_gain; int i_flag; int i; i_flag = app_HkRead( Gd_N_EWO, uc_HK ); if( i_flag == 0 ){ // WFC-E 入力チャンネル :: WFC_E_INP_SEL (Byte:02, Bit:04, Size:02) G13uc_WFCE_input_select = ( uc_HK[0x02] & 0x0c ) >> 2; // WFC-B LF :: WFC_B_LPF_STS (Byte:01, Bit:06, Size:01) if( ( uc_HK[0x01] & 0x02 ) == 0 ) G13uc_WFCB_LF = 1; // WFC-B FIR 0x00:OFF, 0x01:ON else G13uc_WFCB_LF = 0; // ゲイン // WPTP_GAIN (Byte:00, Bit:05, Size:01) uc_WPTP_gain = ( uc_HK[0x00] & 0x04 ) >> 2; // WFC_E_PGA_STS (Byte:02, Bit:01, Size:02) uc_WFCE_gain = ( uc_HK[0x02] & 0x60 ) >> 5; // WFC_B_PGA_STS (Byte:01, Bit:05, Size:01) uc_WFCB_gain = ( uc_HK[0x01] & 0x04 ) >> 2; // テレメトリ情報更新 for( i=0; i<3; i++ ){ G13st_WFCE_tlm_info[i].uc_pre_gain = uc_WPTP_gain; G13st_WFCE_tlm_info[i].uc_ofa_gain = uc_WFCE_gain; G13st_WFCB_tlm_info[i].uc_pre_gain = 0; G13st_WFCB_tlm_info[i].uc_ofa_gain = uc_WFCB_gain; } } return; // Bin: 7 6 5 4 3 2 1 0 // SIB: 0 1 2 3 4 5 6 7 } /******************************************************************************* OFA-E/B の処理 *******************************************************************************/ void app13_OFA( unsigned char uc_OFA_EB, unsigned int ui_sunpulseCnt ){ unsigned int ui_timeData; int i_bufId; int i_numNewBlock; int i_lastProcBlock; 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 特定番号 // ******************************** int i_nodeId; // NodeID ( Gd_N_EWO ) int i_dataId; // DataID ( Gd_D_EWOE or Gd_D_EWOB ) int i_headId; // HeadID ( Gd_N_EWOE or Gd_N_EWOB ) int i_packet_dataId; // EWO packet data ID int i_dataSize; // EWO packet データサイズ unsigned int ui_TI1; // 4 Bytes, LSB: 1.953ms unsigned int ui_TI2; // 2 Bytes, LSB: 122us unsigned char uc_TI2; // ( EWO_CNT[0] << 4 ) + ( EWO_CNT[1] >> 4 ) unsigned int ui_spin_period; // スピン周期.2048 (0x0800) = 4sec double f_spin_period; // スピン周期(秒) int i_nPacket_1spin; // 1周期あたりのパケット数 int i_packet_size; // データパケットサイズ int i_num_offset; // ブロック先頭からのパケット読み飛ばし数 int i_num_skip; // パケット読み飛ばし間隔 int i_num_read; // 読み出しパケット数 int i_num_read_base; // 読み出しパケット数計算基準値 int i_num_data; // 読み出し済みパケットデータ数 unsigned char uc_ofa_channel[3]; // OFA チャンネル(0,1.2 = L,M1,M2) unsigned char *uc_tlm_buf[3]; // テレメトリデータバッファ(0,1.2 = L,M1,M2) int *i_tlm_size[3]; // テレメトリデータバッファのサイズ EWO_PACKET_INFO *st_tlm_info[3]; // テレメトリパケット情報 int uc_tlm_bitrate[3]; // L:2, M:3 unsigned char *uc_tlm_ready[3]; // Telemtry packt ready // 汎用 int i_flag; int i_int_chg; int i; // 周波数テーブル点数 int i_n_freq_table_def_E_L[3] = { 18, 36, 72 }; // OFA-E L-mode int i_n_freq_table_def_E_M[3] = { 90, 180, 360 }; // OFA-E M-mode int i_n_freq_table_def_B_L[3] = { 18, 36, 72 }; // OFA-B L-mode // int i_n_freq_table_def_B_M[3] = { 180, 360, 720 }; // OFA-B M-mode int i_n_freq_table_def_B_M[3] = { 90, 180, 360 }; // OFA-B M-mode OFA-E と同一にする 2012.08.09 // パケット読み飛ばし数の基準 int i_n_skip_base[3] = { 1, 2, 4 }; // WFC-E HF 時ループ回数 int i_n_loop[3] = { 4, 2, 1 }; int i_loop_count; // ------------------------------------------------------------------------- // 初期化 // ------------------------------------------------------------------------- i_nodeId = Gd_N_EWO; // データパケット読み出し関係 i_num_offset = 0; // ブロック先頭からのパケット読み飛ばし数(ダミー値.後に計算) i_num_skip = 0; // パケット読み飛ばし間隔(ダミー値.後に計算) i_num_read_base = 4; // 読み出しパケット数計算基準値(4 packets = 2048 points) i_num_data = 0; // 読み出し済みパケットデータ数(ダミー値.後に計算) // テレメトリパケット関係 // Bitrate uc_tlm_bitrate[0] = 2; // L uc_tlm_bitrate[1] = 3; // M1 uc_tlm_bitrate[2] = 3; // M2 // if( G13i_WFC_freq_table_ready == 0 ){ for( i=0; i<3; i++ ){ G13i_WFCE_tlm_size[i] = TLM_DATA_TOP; G13i_WFCB_tlm_size[i] = TLM_DATA_TOP; } } // EWO-E/B 個別設定 if( uc_OFA_EB == Gd_EWO_OFA_E ){ // 機器 ID 関係 i_dataId = Gd_D_EWOE; i_headId = Gd_N_EWOE; // TI G13ui_EWO_TI1 = &G13ui_EWOE_TI1; G13us_EWO_TI2 = &G13us_EWOE_TI2; G13uc_EWO_TI2 = &G13uc_EWOE_TI2; G13uc_EWO_dataId = &G13uc_EWOE_dataId; // データパケットサイズ i_packet_size = Gd_Pac_EWOE; // OFA チャンネル uc_ofa_channel[0] = G13uc_WFCE_L_channel; uc_ofa_channel[1] = G13uc_WFCE_M1_channel; uc_ofa_channel[2] = G13uc_WFCE_M2_channel; // 周波数テーブル G13i_WFCE_freq_table_length_L = i_n_freq_table_def_E_L[G13uc_WFC_OFA_interval]; G13i_WFCE_freq_table_length_M = i_n_freq_table_def_E_M[G13uc_WFC_OFA_interval]; G13i_WFC_freq_table[0] = G13i_WFCE_freq_table_L; G13i_WFC_freq_table[1] = G13i_WFCE_freq_table_M; G13i_WFC_freq_table[2] = G13i_WFCE_freq_table_M; G13i_WFC_freq_table_length[0] = G13i_WFCE_freq_table_length_L; G13i_WFC_freq_table_length[1] = G13i_WFCE_freq_table_length_M; G13i_WFC_freq_table_length[2] = G13i_WFCE_freq_table_length_M; // テレメトリパケットバッファ uc_tlm_buf[0] = G13uc_WFCE_L; uc_tlm_buf[1] = G13uc_WFCE_M1; uc_tlm_buf[2] = G13uc_WFCE_M2; // テレメトリパケット書き込みポインタ // テレメトリパケットバッファのサイズ for( i=0; i<3; i++ ){ i_tlm_size[i] = &G13i_WFCE_tlm_size[i]; st_tlm_info[i] = &G13st_WFCE_tlm_info[i]; uc_tlm_ready[i] = &G13uc_EWOE_OFA_tlm_ready[i]; } } else{ // 機器 ID 関係 i_dataId = Gd_D_EWOB; i_headId = Gd_N_EWOB; // TI G13ui_EWO_TI1 = &G13ui_EWOB_TI1; G13us_EWO_TI2 = &G13us_EWOB_TI2; G13uc_EWO_TI2 = &G13uc_EWOB_TI2; G13uc_EWO_dataId = &G13uc_EWOB_dataId; // データパケットサイズ i_packet_size = Gd_Pac_EWOB; // OFA チャンネル uc_ofa_channel[0] = G13uc_WFCB_L_channel; uc_ofa_channel[1] = G13uc_WFCB_M1_channel; uc_ofa_channel[2] = G13uc_WFCB_M2_channel; // 周波数テーブル G13i_WFCB_freq_table_length_L = i_n_freq_table_def_B_L[G13uc_WFC_OFA_interval]; G13i_WFCB_freq_table_length_M = i_n_freq_table_def_B_M[G13uc_WFC_OFA_interval]; G13i_WFC_freq_table[0] = G13i_WFCB_freq_table_L; G13i_WFC_freq_table[1] = G13i_WFCB_freq_table_M; G13i_WFC_freq_table[2] = G13i_WFCB_freq_table_M; G13i_WFC_freq_table_length[0] = G13i_WFCB_freq_table_length_L; G13i_WFC_freq_table_length[1] = G13i_WFCB_freq_table_length_M; G13i_WFC_freq_table_length[2] = G13i_WFCB_freq_table_length_M; // テレメトリパケットバッファ uc_tlm_buf[0] = G13uc_WFCB_L; uc_tlm_buf[1] = G13uc_WFCB_M1; uc_tlm_buf[2] = G13uc_WFCB_M2; // テレメトリパケット書き込みポインタ // テレメトリパケットバッファのサイズ for( i=0; i<3; i++ ){ i_tlm_size[i] = &G13i_WFCB_tlm_size[i]; st_tlm_info[i] = &G13st_WFCB_tlm_info[i]; uc_tlm_ready[i] = &G13uc_EWOB_OFA_tlm_ready[i]; } } for( i=0; i<3; i++ ){ (*st_tlm_info[i]).uc_bitrate = uc_tlm_bitrate[i]; (*st_tlm_info[i]).uc_interval = G13uc_WFC_OFA_interval; } // 初回のみ,TRG 用周波数テーブルを初期化 if( G13i_WFC_freq_table_ready == 0 ){ app13_EWO_freq_table_init( G13i_WFC_freq_table_TRG, // 周波数テーブル先頭ポインタ 1024, // 元々の周波数テーブルの点数 8, // 生成する周波数テーブルの点数 32768, // 元々のテーブルの最大周波数 32768 // 生成する周波数テーブルの最大周波数 ); G13i_WFC_freq_table_ready = 1; } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- // **** テレメトリデータの送出と,テレメトリバッファの初期化 **** // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- // TI, dataId // 2013.05.23 T.Imachi ui_TI1 = *G13ui_EWO_TI1; // 2013.05.23 T.Imachi uc_TI2 = *G13uc_EWO_TI2; // 2013.05.23 T.Imachi i_packet_dataId = *G13uc_EWO_dataId; // 2013.05.23 T.Imachi // スペクトル生成間隔の変化は先にチェック i_int_chg = 0; if( uc_OFA_EB == Gd_EWO_OFA_E ){ i_int_chg |= app13_EWO_OFA_param_check( &G13uc_WFC_OFA_E_interval_prev, G13uc_WFC_OFA_interval ); // OFA-E obs. interval } else{ i_int_chg |= app13_EWO_OFA_param_check( &G13uc_WFC_OFA_B_interval_prev, G13uc_WFC_OFA_interval ); // OFA-B obs. interval } // L, M1, M2 のループ (i=0:L, 1:M1, 2:M2) for( i=0; i<3; i++ ){ // ------------------------------------------------------------------------- // 設定パラメータのチェック // ------------------------------------------------------------------------- // パラメータに変化があった場合,i_flag は1となる. i_flag = i_int_chg; i_flag |= app13_EWO_OFA_param_check( &(*st_tlm_info[i]).uc_ofa_channel, uc_ofa_channel[i] ); // OFA Channel if( uc_OFA_EB == Gd_EWO_OFA_E){ // i_flag |= app13_EWO_OFA_param_check( &(*st_tlm_info[i]).uc_data_spec, G13uc_WFCE_input_select ); } else{ i_flag |= app13_EWO_OFA_param_check( &(*st_tlm_info[i]).uc_data_spec, 0x30 ); } // AM2P check // 2014.09.03 Imachi if( G14uc_AM2P_stage != 0 ) i_flag = 1; // パラメータに変化がない場合 if( i_flag == 0 ){ // L-mode : 8 スピンごとに送出 if( i == 0 && ( ui_sunpulseCnt & 0x07 ) != 0x00 ) continue; } // パラメータが変化した場合 else{ // 周波数テーブルの更新 app13_EWO_freq_table_init( G13i_WFC_freq_table[i], // 周波数テーブル先頭ポインタ 1024, // 元々の周波数テーブルの点数 G13i_WFC_freq_table_length[i], // 生成する周波数テーブルの点数 32768, // 元々のテーブルの最大周波数 32768 // 生成する周波数テーブルの最大周波数 ); // TLM packet info st_tlm_info[i]->i_n_spec_data = G13i_WFC_freq_table_length[i]; } // ------------------------------------------------------------------------- // テレメトリパケット送出とバッファ初期化 // ------------------------------------------------------------------------- // OFA-L counter reset // 2014.09.03 Imachi if( i == 0 ){ if( uc_OFA_EB == Gd_EWO_OFA_E ){ G13uc_OFA_E_L_count = -1; } else{ G13uc_OFA_B_L_count = -1; } } // テレメトリパケットが準備できてなければ,送出しない if( *uc_tlm_ready[i] < 1 ) continue; // テレメトリパケットヘッダ生成 //ui_TI1 = *G13ui_EWO_TI1; //uc_TI2 = *G13uc_EWO_TI2; //i_packet_dataId = *G13uc_EWO_dataId; // L if( i == 0 ){ app13_EWO_OFA_make_tlm_header( st_tlm_info[0], st_tlm_info[0], G13ui_EWO_spin_period, uc_TI2, *i_tlm_size[0], uc_tlm_buf[0] ); // ISDM if( uc_OFA_EB == Gd_EWO_OFA_E && G14uc_ISDM_tlm_size > 0 ){ memcpy( &uc_tlm_buf[0][*i_tlm_size[0]], &G14uc_ISDM_tlm[0], G14uc_ISDM_tlm_size ); *i_tlm_size[0] += G14uc_ISDM_tlm_size; G14uc_ISDM_tlm_size = 0; } } // M1 else if( i == 1 ){ app13_EWO_OFA_make_tlm_header( st_tlm_info[1], st_tlm_info[2], G13ui_EWO_spin_period, uc_TI2, *i_tlm_size[1], uc_tlm_buf[1] ); } else continue; // H-dump flag if( Gui_TRG_TiStart < ui_TI1 + G13ui_EWO_spin_period * 2 && ui_TI1 - G13ui_EWO_spin_period * 5 < Gui_TRG_TiEnd ) uc_tlm_buf[i][3] |= 0x80; // テレメトリパケット送出 if( ui_TI1 != 0 ){ // ui = ui_TI1 + app_ti_spinRate( ui_TI1, Gd_N_EWO, &ui_spinCount ) + (ui_TI2 >> 4); // TI correction - 1 spin-later + SunPulse delay app_PutTlm( 13, // [INPUT] APP-NUM: 13 Gd_N_EWO, // [INPUT] Node ID i_dataId, // [INPUT] Data ID i_headId, // [INPUT] Header ID (for PID-ID, CAT-ID settings) uc_tlm_bitrate[i], // [INPUT] DR-ID (for CAT-ID) (0:HK, 1:OS, 2:L, 3:M, 4-9:H(0-5)) Guc_TLMm_cmp[i_headId], // *** rev 121125 by YK *** // 0, // [INPUT] Comp mode (0:non, 1:JPEG-rev, 2:JPEG-nonrev, 3:After-User-Comp) i_packet_dataId, // [INPUT] Packet ID (EWO パケットのデータID) ui_TI1, // [INPUT] Data TI (先頭データの Sun pulse 時刻) Guc_cmdDummy, // [INPUT] Comment (コメントは使用しない.ダミー渡し) 0, // [INPUT] Comment size (コメントは使用しない.0) uc_tlm_buf[i], // [INPUT] Data (テレメトリデータのバッファ) *i_tlm_size[i] // [INPUT] Data size(テレメトリデータのサイズ) ); } // テレメトリバッファ初期化 *i_tlm_size[i] = TLM_DATA_TOP; *uc_tlm_ready[i] = 0; *G13ui_EWO_TI1 = 0; } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- // ******** L/M データの生成 ******** // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- // 処理対象ブロックとして,未処理ブロックのうち,最新のものを探す. // (ブロック時刻情報も更新) // 未処理ブロックが無ければ,時刻情報を更新して終了. // ------------------------------------------------------------------------- // 未処理ブロックの Buffer-ID を求める. // i_bufId には Buffer-ID (0:Long, 1:Short, -1:no data) が返る. i_bufId = app_CheckNonProcBlock( Gd_N_EWO, i_dataId, // [INPUT] Node/Data ID Gui_TLMm_blockTime[i_headId], // [INPUT] TI of Processed Block &ui_timeData // [OUTPUT] TI of Newest Block in the selected buffer ); // i_bufId が no data の場合,処理はここで終了. if( i_bufId < 0 ) return; // 未処理ブロック数を求める. // i_numNewBlock にブロック数が返る.負の数が返った場合はデータ無し(エラー) i_numNewBlock = app_SetNonProcBlock( Gd_N_EWO, i_dataId, // [INPUT] Node/Data ID i_bufId, // [INPUT] Buffer ID Gui_TLMm_blockTime[i_headId], // [INPUT] IT of Processed Block &t_blockInfo // [OUTPUT] Block info ); // 未処理ブロックが一つも無い場合,i_bufId と共に求めたブロックの最新TIを, // 次回参照される処理済みブロックTIとして上書きして終了. if( i_numNewBlock < 1 ){ if( uc_OFA_EB == Gd_EWO_OFA_B ) Gui_EWO_WFCB_blockTime = Gui_TLMm_blockTime[i_headId]; Gui_TLMm_blockTime[i_headId] = ui_timeData; return; } // 最後のブロックまで読み飛ばす if( i_numNewBlock >= 2 ){ i_lastProcBlock = i_numNewBlock - 2; } else{ i_lastProcBlock = i_numNewBlock - 1; } for( i=0; i Gui_TLMm_blockTime[i_headId] && t_blockInfo.i_replyNum > 0 && t_blockInfo.c_invalidFlg == 0 ){ if( uc_OFA_EB == Gd_EWO_OFA_B ) Gui_EWO_WFCB_blockTime = Gui_TLMm_blockTime[i_headId]; Gui_TLMm_blockTime[i_headId] = t_blockInfo.ui_createTime; } else{ if( uc_OFA_EB == Gd_EWO_OFA_B ) Gui_EWO_WFCB_blockTime = Gui_TLMm_blockTime[i_headId]; Gui_TLMm_blockTime[i_headId] = ui_timeData; return; } // ------------------------------------------------------------------------- // 処理対象ブロックの,最初の1パケットのヘッダ情報を取得する // 読み出しに失敗したら,終了. // ------------------------------------------------------------------------- i_flag = app_GetPacket( 13, // [INPUT] App-No.: 13 Gd_N_EWO, i_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] 読み出しデータ長 G13uc_data // [OUTPUT] 読み出しデータ収納バッファ ); if( i_flag != 0 ) return; // DataID の取得 // EWO-Header::DataID (EWO-Head::B6-7) i_packet_dataId = G13uc_data[22]; // Date ID のチェック if( uc_OFA_EB == Gd_EWO_OFA_E ){ // EWO-E: G13uc_data の 22-23 が 0000 か 0100 でなければ,エラーとして終了 if ( ( G13uc_data[22] != 0x00 && G13uc_data[22] != 0x01) || G13uc_data[23] != 0 ) return; i_num_read = i_num_read_base; } else{ // EWO-B: G13uc_data の 22-23 が 3000 か 3100 でなければ,エラーとして終了 if ( ( G13uc_data[22] != 0x30 && G13uc_data[22] != 0x31) || G13uc_data[23] != 0 ) return; // MF, LF のチェック if( i_packet_dataId == 0x30 ) G13uc_WFCB_LF = 1; else G13uc_WFCB_LF = 0; // LF の場合,読み出しデータ数を4倍にする. if( G13uc_WFCB_LF != 0 ) i_num_read = i_num_read_base * 4; else i_num_read = i_num_read_base; } *G13uc_EWO_dataId = i_packet_dataId; // Sun pulse TI の取得 // EWO-Head::B0-3: TI at SunPulse (LSB: 1.953ms) memcpy( &ui_TI1, &G13uc_data[16], 4 ); // EWO-Head::B4-5: EWO counter (LSB: 122us) memcpy( &ui_TI2, &G13uc_data[20], 2 ); uc_TI2 = G13uc_data[20]; *G13ui_EWO_TI1 = ui_TI1; *G13us_EWO_TI2 = ui_TI2; *G13uc_EWO_TI2 = uc_TI2; // ------------------------------------------------------------------------- // スピン周期計算 // ------------------------------------------------------------------------- // スピン周期を計算する (LSB: 1.953ms) if( uc_OFA_EB == Gd_EWO_OFA_E ){ ui_spin_period = ui_TI1 - G13ui_EWOE_TI1_prev; G13ui_EWOE_TI1_prev = ui_TI1; } else{ ui_spin_period = ui_TI1 - G13ui_EWOB_TI1_prev; G13ui_EWOB_TI1_prev = ui_TI1; } // スピン周期が不正な値の場合,スピン周期は 4.5 秒 (0x0900) に仮定 if( ui_spin_period < 0x0800 || ui_spin_period > 0x0A00 ){ ui_spin_period = 0x0900; f_spin_period = (double)ui_spin_period * 1.953 / 1000; } // スピン周期が正常値と思える場合、グローバル変数に保存 else{ f_spin_period = (double)ui_spin_period * 1.953 / 1000; if( uc_OFA_EB == Gd_EWO_OFA_E ){ G13f_EWOE_spin_period = (double)ui_spin_period * 1.953 / 1000; G13ui_EWO_spin_period = ui_spin_period; } else{ G13f_EWOB_spin_period = (double)ui_spin_period * 1.953 / 1000; G13ui_EWO_spin_period = ui_spin_period; } } // ------------------------------------------------------------------------- // 読み出し・読み飛ばしパケット数計算 // ------------------------------------------------------------------------- // 1 スピンあたりのパケット数を計算(スピン周期 * サンプリング周波数 / 1パケットのデータ点数) i_nPacket_1spin = f_spin_period * 65536 / 512; // パケットの読み飛ばし間隔を計算 if( uc_OFA_EB == Gd_EWO_OFA_E && i_packet_dataId == 0x01 ){ // EWO-E HF の場合、固定値 i_num_skip = 80 * i_n_skip_base[G13uc_WFC_OFA_interval]; i_num_offset = 100; } else{ // それ以外の場合、1/4 周期 × 1/観測回数 i_num_skip = ( i_nPacket_1spin / 4 ) * ( i_n_skip_base[G13uc_WFC_OFA_interval] ); // 先頭 1/8 spin (45deg) を読み飛ばす. i_num_offset = i_nPacket_1spin / 8; } i_num_skip -= i_num_read; // ------------------------------------------------------------------------- // 周波数スペクトルを生成 // 次回コール時にテレメトリ送信 // ------------------------------------------------------------------------- // 各パケット毎の処理 i_loop_count = -1; for( i = i_num_offset; i < ( t_blockInfo.i_replyNum - i_num_read ); i += ( i_num_skip + i_num_read ) ){ i_loop_count++; // WFC-E HF 時のみ、ループ回数を固定 if( uc_OFA_EB == Gd_EWO_OFA_E && i_packet_dataId == 0x01 ){ if( i_loop_count >= i_n_loop[G13uc_WFC_OFA_interval] ){ break; } } // EWO パケットヘッダの取得 i_flag = app_GetPacket( 13, // [INPUT] App-No.: 13 Gd_N_EWO, i_dataId, // [INPUT] Node/Data ID i_bufId, // [INPUT] Buffer ID &t_blockInfo, // [INPUT] Block info i, // [INPUT] Packet No. (0:先頭) 0, // [INPUT] OFFSET 読み出し開始番地 32, // [INPUT] 読み出しデータ長 G13uc_data // [OUTPUT] 読み出しデータ収納バッファ ); if( i_flag != 0 ) break; // DataID の取得 // EWO-Header::DataID (EWO-Head::B6-7) i_packet_dataId = G13uc_data[22]; // Date ID のチェック if( uc_OFA_EB == Gd_EWO_OFA_E ){ // EWO-E: G13uc_data の 22-23 が 0000 か 0100 でなければ,エラーとして次へ if ( ( G13uc_data[22] != 0x00 && G13uc_data[22] != 0x01) || G13uc_data[23] != 0 ) continue; i_num_read = i_num_read_base; } else{ // EWO-B: G13uc_data の 22-23 が 3000 か 3100 でなければ,エラーとして次へ if ( ( G13uc_data[22] != 0x30 && G13uc_data[22] != 0x31) || G13uc_data[23] != 0 ) continue; // MF, LF のチェック if( i_packet_dataId == 0x30 ) G13uc_WFCB_LF = 1; else G13uc_WFCB_LF = 0; // LF の場合,読み出しデータ数を4倍にする. if( G13uc_WFCB_LF != 0 ) i_num_read = i_num_read_base * 4; else i_num_read = i_num_read_base; } // Sun pulse TI の取得 // EWO-Head::B0-3: TI at SunPulse (LSB: 1.953ms) // EWO-Head::B4-5: Time after SunPulse (LSB: 122us) memcpy( &ui_TI1, &G13uc_data[16], 4 ); memcpy( &ui_TI2, &G13uc_data[20], 2 ); uc_TI2 = ( G13uc_data[20] << 4 ) + ( G13uc_data[21] >> 4 ); // DataSize の取得 // EWO-Header::DataSize (EWO-Head::B8-9) i_dataSize = ( G13uc_data[24] << 8 ) + G13uc_data[25]; // ------------------------------------------------------------------------- // データパケット読み込み // ------------------------------------------------------------------------- // パケット全体を取得 i_flag = app_GetPacket( 13, // [INPUT] App-No.: 13 Gd_N_EWO, i_dataId, // [INPUT] Node/Data ID i_bufId, // [INPUT] Buffer ID &t_blockInfo, // [INPUT] Block info i, // [INPUT] Packet No. (0:先頭) 0, // [INPUT] OFFSET 読み出し開始番地 i_packet_size * i_num_read, // [INPUT] 読み出しデータ長 G13uc_data // [OUTPUT] 読み出しデータ収納バッファ ); // 読み出し済みデータ点数を更新 i_num_data = i_packet_size * i_num_read; // スペクトル生成 // L, M1, M2 app13_EWO_OFA_make_spectrum( uc_OFA_EB, // [INPUT] OFA-E or OFA-B G13uc_data, // [INPUT] 入力データバッファ(関数中で上書き再利用あり) i_num_data, // [INPUT] 入力データの大きさ(Byte) uc_ofa_channel, // [INPUT] L,M1,M2 のチャンネル(0:ABS,1:X,2:Y,3:Z) uc_tlm_buf, // [INPUT/OUTPUT] テレメトリパケットバッファ i_tlm_size, // [INPUT/OUTPUT] テレメトリパケットバッファのサイズ uc_tlm_ready ); // Dummy for break pointer i_num_data++; i_num_data--; } // End of Loop (each packet) // Dummy for break pointer i_num_data++; i_num_data--; return; } /******************************************************************************* パラメータ値の更新 -------------------------------------------------------------------------------- 新しい値と現在の値が同じであれば0を返す. 異なっていれば,代入した上で1を返す. *******************************************************************************/ int app13_EWO_OFA_param_check( unsigned char *cur, // [INPUT/OUTPUT] 現在のパラメータ値 unsigned char new // [INPUT] 新しいパラメータ値 ){ if( *cur == new ) return 0; else{ *cur = new; return 1; } } /******************************************************************************* テレメトリパケットヘッダ書き込み *******************************************************************************/ /* typedef struct { unsigned char uc_data_spec; // データ区分 unsigned char uc_bitrate; // ビットレート ( L:2, M:3 ←暫定?) unsigned char uc_interval; // データ生成間隔 unsigned char uc_ofa_channel; // OFA チャンネル (0:ABS, 1:E1/Bx, 2:E2/By, 3:Bz) int i_n_spec_data; // スペクトルデータ点数 unsigned char uc_cal_on; // CAL ON/OFF (0:OFF, 1:ON) unsigned char uc_pre_gain; // プリアンプゲイン unsigned char uc_ofa_gain; // OFA/WFC ゲイン } EWO_PACKET_INFO; */ void app13_EWO_OFA_make_tlm_header( EWO_PACKET_INFO *st_tlm_info1, // [INPUT] テレメトリ情報 EWO_PACKET_INFO *st_tlm_info2, // [INPUT] テレメトリ情報 unsigned int ui_spinrate, // [INPUT] Spin rate unsigned char uc_TI2, // [INPUT] EWO counter (reduced) int i_size, // [INPUT] テレメトリサイズ unsigned char *uc_buf // [OUTPUT] テレメトリパケットバッファ ){ unsigned char uc_ch_int, uc_gain; i_size -= TLM_DATA_TOP; // Channel & time interval uc_ch_int = 0x00; uc_ch_int |= ( 1 << st_tlm_info1->uc_ofa_channel ); // Channel 1 uc_ch_int |= ( 1 << st_tlm_info2->uc_ofa_channel ); // Channel 2 uc_ch_int |= ( ( st_tlm_info1->uc_interval & 0x03 ) << 4 ); // Time interval // Gain uc_gain = 0x00; uc_gain |= ( ( st_tlm_info1->uc_pre_gain & 0x01 ) << 2 ); uc_gain |= ( ( st_tlm_info1->uc_ofa_gain & 0x03 ) ); // ======================================================================= // B0: EWO counter uc_buf[0] = uc_TI2; // B1-B2: Spin rate uc_buf[1] = (unsigned char)( ( ui_spinrate >> 8 ) & 0xff ); uc_buf[2] = (unsigned char)( ui_spinrate & 0xff ); // B3: OFA channel & time inteval uc_buf[3] = uc_ch_int; // B4: Gain uc_buf[4] = uc_gain; // B5: Spec uc_buf[5] = st_tlm_info1->uc_data_spec; // B6-B7: Spectrum length uc_buf[6] = (unsigned char)( st_tlm_info1->i_n_spec_data >> 8 ); uc_buf[7] = (unsigned char)( st_tlm_info1->i_n_spec_data &0xff ); // B8-B9: Data size uc_buf[8] = (unsigned char)( ( i_size >> 8 ) & 0xff ); uc_buf[9] = (unsigned char)( i_size & 0xff ); } /******************************************************************************* スペクトル生成 *******************************************************************************/ void app13_EWO_OFA_make_spectrum( unsigned char uc_OFA_EB, // [INPUT] OFA-E or OFA-B unsigned char *uc_data, // [INPUT] 入力データバッファ(関数中で上書き再利用あり) unsigned int ui_data_size, // [INPUT] 入力データの大きさ(Byte) unsigned char *uc_ofa_channel, // [INPUT] L,M1,M2 のチャンネル(0:ABS,1:X,2:Y,3:Z) unsigned char **uc_tlm_buf, // [INPUT/OUTPUT] テレメトリパケットバッファ int **i_tlm_size, // [INPUT/OUTPUT] テレメトリパケットバッファのサイズ unsigned char **uc_tlm_ready // [OUTPUT] Telemtry packet ready ){ int i_nPacket; // パケット数 int i_packetSize; // パケットサイズ int i_nRead; // 1パケット辺りのデータ読み出し点数 int i_ch; // チャンネル数 int i_count; // 読み出し済みデータ数のカウント int i_pos_read; // パケットデータ読み出し位置 int i_dataX; int i_dataY; int i_dataZ; int i_nFFT; // FFT 点数 int *i_X_max, *i_Y_max, *i_Z_max, i_dummy; // for AGC int i, j; // ------------------------------------------------------------------------- // 初期設定 // ------------------------------------------------------------------------- i_nFFT = 2048; if( uc_OFA_EB == Gd_EWO_OFA_E ){ i_packetSize = Gd_Pac_EWOE; i_ch = 2; i_nRead = 512; // for AGC i_X_max = &G13i_EWO_WFCE_X_max; i_Y_max = &G13i_EWO_WFCE_Y_max; i_Z_max = &i_dummy; *i_Z_max = 0; } else{ i_packetSize = Gd_Pac_EWOB; i_ch = 3; // WFC-B LF時は,1パケット当たりのデータ点数を 1/4 とする. // (先頭 1/4 しか読まない) if( G13uc_WFCB_LF == 0 ) i_nRead = 512; else i_nRead = 512 / 4; // for AGC i_X_max = &G13i_EWO_WFCB_X_max; i_Y_max = &G13i_EWO_WFCB_Y_max; i_Z_max = &G13i_EWO_WFCB_Z_max; } // ------------------------------------------------------------------------- // データ読み出し(電界2成分もしくは磁界3成分) // ------------------------------------------------------------------------- i_nPacket = ui_data_size / i_packetSize; i_count = 0; // パケットの数だけループ for( i=0; i= 32768 ){ i_dataX -= 65536; *i_X_max |= i_dataX * ( -1 ); } else *i_X_max |= i_dataX; if( i_dataY >= 32768 ){ i_dataY -= 65536; *i_Y_max |= i_dataY * ( -1 ); } else *i_Y_max |= i_dataY; if( i_dataZ >= 32768 ){ i_dataZ -= 65536; *i_Z_max |= i_dataZ * ( -1 ); } else *i_Z_max |= i_dataZ; // 浮動小数点バッファに波形をそのまま保存 G13f_WFC_X_org[i_count] = (double)i_dataX; G13f_WFC_Y_org[i_count] = (double)i_dataY; G13f_WFC_Z_org[i_count] = (double)i_dataZ; i_count++; } } /* // ------------------------------------------------------------------------- // !!!テスト用擬似信号!!! // ------------------------------------------------------------------------- for( i=0; i 0 && uc_ofa_channel[i] <= 2 ) || ( uc_ofa_channel[i] == 3 && uc_OFA_EB == Gd_EWO_OFA_B ) ){ // // 絶対値以外(チャンネルが1〜3のとき) // // スペクトルデータの dB 化 // 収納先は,G13uc_data を再利用 app13_EWO_spectrum_dB( G13uc_data, // [OUTPUT] 出力先バッファ G13f_WFC_spec_ave[uc_ofa_channel[i]-1], // [INPUT] 元データ(スペクトル輝度の二乗値) G13i_WFC_freq_table_length[i], // [INPUT] 元データの数 i_nFFT // [INPUT] 除算値(FFT点数) ); } // テレメトリバッファに収納 // L-mode if( i==0 ){ memcpy( &uc_tlm_buf[0][*i_tlm_size[0]], G13uc_data, G13i_WFC_freq_table_length[0] ); *i_tlm_size[0] += G13i_WFC_freq_table_length[0]; } // M-mode else{ memcpy( &uc_tlm_buf[1][*i_tlm_size[1]], G13uc_data, G13i_WFC_freq_table_length[i] ); *i_tlm_size[1] += G13i_WFC_freq_table_length[i]; } *uc_tlm_ready[i] = 1; } // Loop end ( L, M1, M2 のループ (i=0:L, 1:M1, 2:M2) ) // ------------------------------------------------------------------------- // TRG変数への代入 // ------------------------------------------------------------------------- // Gui_TRG2_SpTI_s より TI を検索 /* ***** COMMENT-OUT ***** // ***** rev. 121125 by Y.K. **** for( i=0; i 0 ){ */ i = app_tiTrgSearch( *G13ui_EWO_TI1, Gd_N_EWO ); // ***** added! 121125 by Y.K. **** if (i) { // ***** added! 121125 by Y.K. **** // 周波数平均 app13_EWO_spectrum_reduce( G13f_WFC_spec_ave[0], // [OUTPUT] データ出力バッファ G13f_WFC_X_spec_re, // [INPUT] スペクトル実部の配列 G13f_WFC_X_spec_im, // [INPUT] スペクトル虚部の配列 i_nFFT / 2, // [INPUT] スペクトル点数 G13i_WFC_freq_table_TRG, // [INPUT] 平均化周波数テーブル 8 // [INPUT] 平均化周波数テーブル長 ); app13_EWO_spectrum_reduce( G13f_WFC_spec_ave[1], // [OUTPUT] データ出力バッファ G13f_WFC_Y_spec_re, // [INPUT] スペクトル実部の配列 G13f_WFC_Y_spec_im, // [INPUT] スペクトル虚部の配列 i_nFFT / 2, // [INPUT] スペクトル点数 G13i_WFC_freq_table_TRG, // [INPUT] 平均化周波数テーブル 8 // [INPUT] 平均化周波数テーブル長 ); if( uc_OFA_EB == Gd_EWO_OFA_B ){ app13_EWO_spectrum_reduce( G13f_WFC_spec_ave[2], // [OUTPUT] データ出力バッファ G13f_WFC_Z_spec_re, // [INPUT] スペクトル実部の配列 G13f_WFC_Z_spec_im, // [INPUT] スペクトル虚部の配列 i_nFFT / 2, // [INPUT] スペクトル点数 G13i_WFC_freq_table_TRG, // [INPUT] 平均化周波数テーブル 8 // [INPUT] 平均化周波数テーブル長 ); } // 絶対値を TRG 変数に代入 if( uc_OFA_EB == Gd_EWO_OFA_E ){ // 絶対値を計算 for( j = 0; j<8; j++ ){ G13f_WFC_spec_abs[j] = G13f_WFC_spec_ave[0][j] + G13f_WFC_spec_ave[1][j]; } // TRG 変数へ代入 app13_EWO_spectrum_dB( &Guc_TRG2_EWO_Esp[ i - 1 ][0], // [OUTPUT] 出力先バッファ G13f_WFC_spec_abs, // [INPUT] 元データ(スペクトル輝度の二乗値) 8, // [INPUT] 元データの数 i_nFFT // [INPUT] 除算値(FFT点数) ); // Unsigned range にするため、+0x80 for( j=0; j<8; j++ ){ Guc_TRG2_EWO_Esp[ i - 1 ][j] = (unsigned char)( (char)Guc_TRG2_EWO_Esp[ i - 1 ][j] + 0x80 ); } } else{ // 絶対値を計算 for( j = 0; j<8; j++ ){ G13f_WFC_spec_abs[j] = G13f_WFC_spec_ave[0][j] + G13f_WFC_spec_ave[1][j] + G13f_WFC_spec_ave[2][j]; } // TRG 変数へ代入 app13_EWO_spectrum_dB( &Guc_TRG2_EWO_Bsp[ i - 1 ][0], // [OUTPUT] 出力先バッファ G13f_WFC_spec_abs, // [INPUT] 元データ(スペクトル輝度の二乗値) 8, // [INPUT] 元データの数 i_nFFT // [INPUT] 除算値(FFT点数) ); // Unsigned range にするため、+0x80 for( j=0; j<8; j++ ){ Guc_TRG2_EWO_Bsp[ i - 1 ][j] = (unsigned char)( (char)Guc_TRG2_EWO_Bsp[ i - 1 ][j] + 0x80 ); } } } } /******************************************************************************* スペクトル点数縮減 *******************************************************************************/ void app13_EWO_spectrum_reduce( double *f_buf, // [OUTPUT] データ出力バッファ double *f_re, // [INPUT] スペクトル実部の配列 double *f_im, // [INPUT] スペクトル虚部の配列 int i_data_length, // [INPUT] スペクトル点数 int *i_freq_table, // [INPUT] 平均化周波数テーブル int i_freq_table_length // [INPUT] 平均化周波数テーブル長 ) { int i_freq_from, i_freq_to; // int i_freq_prev; // double f_freq_diff; double f_tmp; double *f_wp; int i, j; // データの書き込み先を指定 f_wp = f_buf; // i_freq_prev = 0; // 周波数テーブルの要素毎に処理 // 周波数テーブルの要素: FFT 後の周波数成分番号 // for( i=0; i 127 ) f_tmp = 127; if( f_tmp < -128 ) f_tmp = -128; // 出力バッファに収納 // (unsigned char にキャストしても,符号は保持される) *uc_wp++ = (unsigned char)( f_tmp ); //*uc_wp++ = f_data[i]; } return; } /******************************************************************************* 周波数テーブル初期化 *******************************************************************************/ void app13_EWO_freq_table_init( int *i_freq_table, // 周波数テーブル先頭ポインタ int i_table_size_org, // 元々の周波数テーブルの点数 int i_table_size_out, // 生成する周波数テーブルの点数 double f_fmax_org, // 元々のテーブルの最大周波数 double f_fmax_out // 生成する周波数テーブルの最大周波数 ) { double f_df; double f_a, f_b, f_c; int i_n1, i_n2; int i; // 周波数分解能を計算 f_df = f_fmax_org / (double)i_table_size_org; // for( i=0; i= i_n2 ){ i_freq_table[i] = i_n1 - 1; } else{ i_freq_table[i] = i_n2 - 1; } } } /******************************************************************************* AGC *******************************************************************************/ void app13_EWO_AGC( unsigned int ui_sunpulseCnt, unsigned char uc_OFA_EB ) { unsigned char uc_AGC_ena; int i_max; if( uc_OFA_EB == Gd_EWO_OFA_E ){ uc_AGC_ena = G13uc_EWOE_AGC_ena; i_max = G13i_EWO_WFCE_X_max | G13i_EWO_WFCE_Y_max; } else{ uc_AGC_ena = G13uc_EWOB_AGC_ena; i_max = G13i_EWO_WFCB_X_max | G13i_EWO_WFCB_Y_max | G13i_EWO_WFCB_Z_max; } // AGC enabled の場合 if( uc_AGC_ena != 0 ){ // AGC実行タイミングでなければ終了 if( ( ui_sunpulseCnt & G13uc_EWO_AGC_interval ) != 0x00 ) return; if( uc_OFA_EB == Gd_EWO_OFA_E ){ // ゲインアップ if( i_max < G13i_EWO_WFCE_lower_limit ){ G13c_EWO_WFCE_AGC_act = 1; } // ゲインダウン if( i_max > G13i_EWO_WFCE_upper_limit ){ G13c_EWO_WFCE_AGC_act = -1; } } else{ // ゲインアップ if( i_max < G13i_EWO_WFCB_lower_limit ){ G13c_EWO_WFCB_AGC_act = 1; } // ゲインダウン if( i_max > G13i_EWO_WFCB_upper_limit ){ G13c_EWO_WFCB_AGC_act = -1; } } } // 最高ビット値初期化 // (AGC disabled の場合と、AGC enabled で AGC 実行タイミングの場合)s if( uc_OFA_EB == Gd_EWO_OFA_E ){ G13i_EWO_WFCE_X_max = 0; G13i_EWO_WFCE_Y_max = 0; } else{ G13i_EWO_WFCB_X_max = 0; G13i_EWO_WFCB_Y_max = 0; G13i_EWO_WFCB_Z_max = 0; } } /******************************************************************************* ISDM table dump *******************************************************************************/ void app13_EWO_ISDM_table_dump() { unsigned int ui_TI; M_T_TIME_INFO t_timeInfo; if( G14uc_ISDM_table_dump_ena == 0 ) return; dpu_getTime(&t_timeInfo); ui_TI = (t_timeInfo.ui_currentTime); // unsigned int ui_currentTime; 衛星時刻(1LSB=1.953ms) // B0: N/A (EWO counter) G13uc_data[0] = 0x00; // B1-B2: N/A (Spin rate) G13uc_data[1] = 0x00; G13uc_data[2] = 0x00; // B3: N/A (OFA channel & time inteval) G13uc_data[3] = 0x00; // B4: N/A (Gain) G13uc_data[4] = 0x00; // B5: Spec G13uc_data[5] = 0xdd; /* // B6-B7: Spectrum length G13uc_data[6] = (unsigned char)( st_tlm_info1->i_n_spec_data >> 8 ); G13uc_data[7] = (unsigned char)( st_tlm_info1->i_n_spec_data &0xff ); // B8-B9: Data size G13uc_data[8] = (unsigned char)( ( i_size >> 8 ) & 0xff ); G13uc_data[9] = (unsigned char)( i_size & 0xff ); */ memcpy( &G13uc_data[6], &G14uc_ISDM_table[0], 74 ); app_PutTlm( 13, // [INPUT] APP-NUM: 13 Gd_N_EWO, // [INPUT] Node ID Gd_D_EWOE, // [INPUT] Data ID Gd_N_EWOE, // [INPUT] Header ID (for PID-ID, CAT-ID settings) 0x02, // [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], // *** rev 121125 by YK *** // 0, // [INPUT] Comp mode (0:non, 1:JPEG-rev, 2:JPEG-nonrev, 3:After-User-Comp) 0x00, // [INPUT] Packet ID (EWO パケットのデータID) ui_TI, // [INPUT] Data TI (先頭データの Sun pulse 時刻) Guc_cmdDummy, // [INPUT] Comment (コメントは使用しない.ダミー渡し) 0, // [INPUT] Comment size (コメントは使用しない.0) G13uc_data, // [INPUT] Data (テレメトリデータのバッファ) 80 // [INPUT] Data size(テレメトリデータのサイズ) ); G14uc_ISDM_table_dump_ena = 0; } /* *************************************************************************** [MEMO] ------------------------------------------------------------------------------ スペクトル生成 [INPUT] ( E1, E2 ) or ( Bx, By, Bz ) ↓ 毎回,全成分 FFT(可能な限り,2成分同時) ( E1_re, E1_im, E2_re, E2_im ) or ( Bx_re, Bx_im, By_re, By_im, Bz_re, Bz_im ) ↓ 実,虚,全成分をスペクトル生成関数へ ↓ スペクトル生成 各成分(2乗): re^2 + im^2 絶対値(2乗): Σ( re^2 + im^2 ) ↓ スペクトル平均 2乗のまま平均 ↓ DB化 2乗を吸収 データ点数倍を吸収 ダイナミックレンジ 入力: Signed 14bit = -8192 〜 +8192 → 〜 78.27dB これを char の -128 〜 +127 にフィットさせる. 積分を考慮し,上限には 20 dB 以上の余裕を持たせる. 入力の下限は -20dB 程度を仮定. オリジナル: -20 〜 +78.27 変換方法: * 2 - 80 変換後: -120 〜 +76.54 ------------------------------------------------------------------------------ TI TI1: Sun pulse TI LSB: 1.953 ms TI2: EWO counter LSB: 122 us TI1 / TI2 = 16 TI2 の 1.923ms 分解能化 = TI2 >> 4 OFA L/M では,1.953 ms 分解能値を計算し,32 ms 分解能で下ろす. ( ( TI1 + ( TI2 >> 4 ) ) >> 4 ) & 0xffff; TI1: 7======07======07======07======0 TI2: 7======07======0 TLM: ################ ------------------------------------------------------------------------------ テレメトリパケット 00-03 Sun pulse TI (1.953 ms) 04 EWO count (122us) *************************************************************************** */