/******************************************************************************* * モジュール名称 :APP13 Mission TLM (L&M) PI tasks * * モジュールラベル :app13_EWO-EFD * * タスク区分 :Application-13 EWO-EFD task for Mission TLM (L&M) * * 機能 : * * コーリングシーケンス:void app13_EWO-EFD * * 引数 :なし * * 戻り値 :なし * * 使用上の注意 :グローバル変数はアプリケーション01でまとめて初期化 * * エラー処理 :なし * * 注意 : EDIT権限は、EWO組 * * 作成日・作成者 :2018/1/12 Y. Kasaba * *******************************************************************************/ #include "app_core.h" #include "app_EWO.h" // *** Local Macro *** void app13_EFD_putTLM ( int, unsigned int, int, unsigned char *, int); // ** Put TLM // int app13_EFD_readPacket ( int, unsigned char *, unsigned char ); // ** RAW Data Decode // void app13_EFD_setTriggerDPB ( unsigned char ); // ** Set |E| void app13_EFD_setTriggerSPB ( unsigned char ); // ** Set Pot // short app13_EFD_ave ( short *, int ); // ** Ave without MAX/MIN int app13_EFD_ang ( int, int ); // ** Reject Eclipse // int app13_EFD_SPB ( unsigned char *, unsigned char *, int *, int * ); int app13_EFD_DPB ( unsigned char *, unsigned char *, int *, int * ); int app13_EFD_SPBpacket ( unsigned int, int, int, unsigned char *, int *, int *, unsigned char *, int *, int *, unsigned char); int app13_EFD_DPBwave ( unsigned int, int, int, unsigned char *, int *, int *, unsigned char *, int *, int *, unsigned char); int app13_EFD_DPBspec ( unsigned int, int, int, unsigned char *, int *, unsigned char *, int *, unsigned char); int app13_EFD_DPB_FFT64 ( short *, unsigned char * ); void app13_EFD( unsigned int ui_sunpulseCnt ) { // === BLOCK read === int i_bufId; // ** Buffer ID int i_numNewBlock; // ** Num of blocks with new data M_T_BLOCK_INFO t_blockInfo; // ** unsigned int ui_createTime Block 生成開始時衛星時刻(1LSB=32ms) // ** int i_replyNum Block 登録Read-Reply個数 // ** char c_invalidFlg Block 内データ異常 [0:異常なし 1:異常あり] // // === Spin Cnt === unsigned char uc_sunpulseCnt; // ** Spin Counter // // === EFD data output === int i_dataId; // EFD-Header: DataID 0:DPB 1:SWP-X1 2:SWP-X2 3:SWP-Y1 4:SWP-Y2 8:SPB int i_MSize, i_LSize; // EFD-Header: Data Size // // === General === int i, j; //, k; int i_flag; unsigned int ui, ui_DPBL_TI, ui_DPBL_size; // -------------------- // -- Spin Pulse Set -- // -------------------- if ( ui_sunpulseCnt > Gui_EFD_Spin+1 ) { Gui_EFD_Spin = ui_sunpulseCnt; for (j=1; j<4; j++) Gui_EFD_DPB_Ti[j+1] = Gui_EFD_SPB_Ti[j+1] = Gus_EFD_DPB_Size[j+1] = Gus_EFD_SPB_Size[j+1] = 0; // 1-4:reset } // ----------------------------------------------------------- // -- Set at the buffer with the oldest non-processed block -- // ----------------------------------------------------------- i_bufId = app_CheckNonProcBlock ( Gd_N_EWO, Gd_D_EFD, // [INPUT] Node/Data ID Gui_TLMm_blockTime[Gd_N_EFD], // [INPUT] TI of Processed Block [LSB:31.25ms] (MDPでの受信時刻) &ui); // [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 -- // ------------------------------------------- i_numNewBlock = app_SetNonProcBlock( Gd_N_EWO, Gd_D_EFD, // [INPUT] Node/Data ID i_bufId, // [INPUT] Buffer ID Gui_TLMm_blockTime[Gd_N_EFD], // [INPUT] TI of Processed Block [LSB:31.25ms] (MDPでの受信時刻) &t_blockInfo); // [OUTPUT] Block Info // (return) >0:Num of blocks, <=0:No data (error) if ( i_numNewBlock < 1 ) return; // <<< No data -- return >>> // --------------------- // -- Read Block data -- // --------------------- for (i=0; i Gui_TLMm_blockTime[Gd_N_EFD] && // NEW data t_blockInfo.i_replyNum > 0 && // Data available t_blockInfo.c_invalidFlg == 0 ) { // Data correct Gui_TLMm_blockTime[Gd_N_EFD] = t_blockInfo.ui_createTime; // TI of Processed data [LSB:31.25ms] (MDPでの受信時刻) if ( i >= i_numNewBlock-4 ) { // Only newest 4 spins processed // **** Block read **** i_flag = app_GetBlock( 13, // [INPUT] App-No:13 Gd_N_EWO, Gd_D_EFD, // [INPUT] Node/Data ID i_bufId, // [INPUT] Buffer ID &t_blockInfo, // [INPUT] Block Info G13uc_data ); // [OUTPUT] 1 Block Data - copied if ( i_flag ) break; // <<< Block read error >>> // *** Pulse Count *** // uc_sunpulseCnt = (ui_sunpulseCnt + i - (i_numNewBlock-1)) & 0x03; // Spin Counter (4スピンに一度、パケット生成) uc_sunpulseCnt = Gui_EFD_Spin & 0x03; if (uc_sunpulseCnt == 1) { for (j=1; j<4; j++) Gui_EFD_DPB_Ti[j+1] = Gui_EFD_SPB_Ti[j+1] = Gus_EFD_DPB_Size[j+1] = Gus_EFD_SPB_Size[j+1] = 0; // 1-4:reset } Gui_EFD_Spin++; // **** Encode TLM **** for (j=0; j<2; j++) { // ------------------------ // -- Decode Packet data -- // ------------------------ i_dataId = app13_EFD_readPacket( j, // [INPUT] Packet No (0:1st 1:2nd) G13uc_data, // [INPUT] Block(RAW) data uc_sunpulseCnt ); // [INPUT] Sun Pulse Counter (0-3) // (return) Header: Data ID 0:DPB 1:SWP-X1 2:SWP-X2 3:SWP-Y1 4:SWP-Y2 8:SPB <0:error if ( i_dataId == 0 ) { // *********************************************************************************************************** // **** DPB **** Gs_EFD_DPB_Data[3200][0:Y 1:X] Gui_EFD_DPB_Ti[5] Gus_EFD_DPB_Size[5] // ID: DPB-M:03 DPB-L:02 // *********************************************************************************************************** app13_EFD_setTriggerDPB( uc_sunpulseCnt ); // [INPUT] EFD-data counter ---> DPB: |E| in 1-spin ave if (uc_sunpulseCnt==3) { if ( Gui_EFD_DPB_Ti[0] && Gui_EFD_DPB_Ti[1] && Gui_EFD_DPB_Ti[2] && Gui_EFD_DPB_Ti[3] && Gui_EFD_DPB_Ti[4] && Gui_EFD_DPB_Ti[4] - Gui_EFD_DPB_Ti[0] <= 0x2800 && // <= 5sec Gui_EFD_DPB_Ti[4] - Gui_EFD_DPB_Ti[0] >= 0x2000 ) { // >= 4sec app13_EFD_DPB ( G13uc_packet, &(G13uc_packet[0x800]), & i_MSize, & i_LSize); // // 2Hz jumping ui = Gui_EFD_DPB_Ti[1] + Gus_EFD_DPB_TiSun[0]; i = (ui % 256); if (i>0) i = 256 - i; ui += i; // if ( Guc_EFD_DPB_ena & 0xF0 ) { app13_EFD_putTLM ( 0x03, ui, 3, G13uc_packet, i_MSize); // EFD data ID = 0x03 [M:DPB data] } if ( Guc_EFD_DPB_ena & 0x0F ) { ui_DPBL_size = i_LSize; // (Packet size of DPB-L) ui_DPBL_TI = ui; // (TI of DPB-L) } } // ------------- // --- COPY! --- // ------------- if ( Gui_EFD_DPB_Ti[3] && Gui_EFD_DPB_Ti[4] && (Gus_EFD_DPB_Size [4] > Gus_EFD_DPB_Size[3]) ) { memcpy( &Gs_EFD_DPB_Data[0][0], &Gs_EFD_DPB_Data[ Gus_EFD_DPB_Size[3] ][0], (Gus_EFD_DPB_Size[4]-Gus_EFD_DPB_Size[3]) * 4 ); Gus_EFD_DPB_Size [0] = Gus_EFD_DPB_Size [4]-Gus_EFD_DPB_Size[3]; Gui_EFD_DPB_Ti [0] = Gui_EFD_DPB_Ti [4]; Gus_EFD_DPB_TiSun[0] = Gus_EFD_DPB_TiSun[4]; } else { for (j=0; j<5; j++) { Gus_EFD_DPB_Size [j] = Gui_EFD_DPB_Ti [j] = Gus_EFD_DPB_TiSun[j] = 0; } } } } else if ( i_dataId == 8 ) { // *********************************************************************************************************** // **** SPB **** Gs_EFD_SPB_Data[ 640][0:Y1 1:X1 2:Y2 3:X2] Gui_EFD_SPB_Ti[5] Gus_EFD_SPB_Size[5] // ID: SPB-M:13 SPB-L:12 BOTH:22 // *********************************************************************************************************** app13_EFD_setTriggerSPB( uc_sunpulseCnt ); // [INPUT] EFD-data counter ---> SPB: Potential in 1-spin ave if (uc_sunpulseCnt==3) { if ( Gui_EFD_SPB_Ti[0] && Gui_EFD_SPB_Ti[1] && Gui_EFD_SPB_Ti[2] && Gui_EFD_SPB_Ti[3] && Gui_EFD_SPB_Ti[4] && Gui_EFD_SPB_Ti[4] - Gui_EFD_SPB_Ti[0] <= 0x2800 && // <= 5sec Gui_EFD_SPB_Ti[4] - Gui_EFD_SPB_Ti[0] >= 0x2000 ) { // >= 4sec app13_EFD_SPB ( G13uc_packet, &(G13uc_packet[0x800 + ui_DPBL_size + 4]), & i_MSize, & i_LSize); // // 2Hz jumping ui = Gui_EFD_SPB_Ti[1] + Gus_EFD_SPB_TiSun[0]; i = (ui % 512); if (i>0) i = 512 - i; ui += i; // if ( Guc_EFD_SPB_ena & 0xF0 ) { app13_EFD_putTLM ( 0x13, ui, 3, G13uc_packet, i_MSize); // EFD data ID = 0x13 [M:SPB data] } if ( Guc_EFD_SPB_ena & 0x0F ) { // app13_EFD_putTLM ( 0x12, ui, 2, &(G13uc_packet[0x800 + ui_DPBL_size + 4]), i_LSize); // EFD data ID = 0x12 [L:SPB-only data] // i_LSize = i_LSize + ui_DPBL_size + 4; memcpy( &(G13uc_packet[0x800+ui_DPBL_size]), &ui, 4); // SPB-TI app13_EFD_putTLM ( 0x22, ui_DPBL_TI, 2, &(G13uc_packet[0x800]), i_LSize); // EFD data ID = 0x22 [L:DPB&SPB data] } } // ------------- // --- COPY! --- // ------------- if ( Gui_EFD_SPB_Ti[3] && Gui_EFD_SPB_Ti[4] && (Gus_EFD_SPB_Size [4] > Gus_EFD_SPB_Size[3]) ) { memcpy( &Gs_EFD_SPB_Data[0][0], &Gs_EFD_SPB_Data[ Gus_EFD_SPB_Size[3] ][0], (Gus_EFD_SPB_Size[4]-Gus_EFD_SPB_Size[3]) * 8 ); Gus_EFD_SPB_Size [0] = Gus_EFD_SPB_Size [4]-Gus_EFD_SPB_Size[3]; Gui_EFD_SPB_Ti [0] = Gui_EFD_SPB_Ti [4]; Gus_EFD_SPB_TiSun[0] = Gus_EFD_SPB_TiSun[4]; } else { for (j=0; j<5; j++) { Gus_EFD_SPB_Size [j] = Gui_EFD_SPB_Ti [j] = Gus_EFD_SPB_TiSun[j] = 0; } } } } else if ( i_dataId > 0 && i_dataId < 5 ) { // *********************************************************************************************************** // ****SWEEP**** 1024B + Header-10B をコピー // *********************************************************************************************************** app13_EFD_putTLM ( i_dataId + 9 + Guc_EFD_SweepTbl * 0x10, Gui_EFD_SWEEP_Ti, 4, G13uc_packet, Gus_EFD_SWEEP_Size); } } } } i_flag = app_NextBlock( Gd_N_EWO, Gd_D_EFD, // [INPUT] Node/Data ID i_bufId, // [INPUT] Buffer ID &t_blockInfo); // [OUTPUT] Block Info if ( i_flag ) break; // no data } return; } // =========================================================================== // app13_EFD_putTLM // [INPUT] int i_dataId Data ID 0:DPB 1:SWP-X1 2:SWP-X2 3:SWP-Y1 4:SWP-Y2 8:SPB // unsigned int ui_dataTi Header: TI // int i_drId, DR-ID = L or H0 (for CAT-ID) [0:HK 1:OS 2:L 3:M 4-9:H(0-5)] // unsigned char uc_data[] Data // int i_dataSize Data Size // =========================================================================== void app13_EFD_putTLM( int i_dataId, // [INPUT] Data ID 0:DPB 1:SWP-X1 2:SWP-X2 3:SWP-Y1 4:SWP-Y2 8:SPB 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; i_flag = app_PutTlm( 13, // [INPUT] APP-NUM = 13 Gd_N_EWO, // [INPUT] Node-ID Gd_D_EFD, // [INPUT] Data-ID Gd_N_EFD, // [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_EFD], // [INPUT] Comp mode [0:non 1:JPEG-rev 2:Math 3-7:After-User-COMP] i_dataId, // [INPUT] Packet ID <<<< USER-DEF: 0x00- 0xFF >>>> ui_dataTi, // [INPUT] Data TI <<<< USER-DEF: 0x00000000-0xFFFFFFFF >>>> Guc_cmdDummy, // [INPUT] Comment <<<< USER-DEF: <128B >>>> 0, // [INPUT] Comment - Size <<<< USER-DEF: <128B >>>> uc_data, // [INPUT] Data <<<< USER-DEF: <0x1E00 >>>> i_dataSize); // [INPUT] Data - Size <<<< USER-DEF: <0x1E00 >>>> return; } // =========================================================================== // app13_EFD_readPacket // [INPUT] int i_pacNo Packet No (0:1st 1:2nd) // unsigned char uc_data[] Block(RAW) data // unsigned char uc_sunpulseCnt Sun Pulse Counter (0-3) // [OUTPUT] unsigned int *uip_dataTi Header: EFD-TI // unsigned int *uip_dataSunc Header: EFD-SunPulse counter // (return) Header: EFD-DataID (0:DPB 1:SWP-X1 2:SWP-X2 3:SWP-Y1 4:SWP-Y2 8:SPB), <0:error // ---------------------------------------------------------------------- // ---> DPB Gs_EFD_DPB_Data [i][0:Y 1:X] // Gui_EFD_DPB_Ti [uc_sunpulseCnt] // Gus_EFD_DPB_Size // SPB Gs_EFD_SPB_Data [i][0:Y1 1:X1 2:Y2 3:X2] // Gui_EFD_SPB_Ti [uc_sunpulseCnt] // Gus_EFD_SPB_Size // SWEEP G13uc_packet 1024Bデータをコピー // =========================================================================== int app13_EFD_readPacket( int i_pacNo, // [INPUT] Packet No (0 or 1: EFD block contains 2 packets) unsigned char uc_data[], // [INPUT] Block(RAW) data unsigned char uc_sunpulseCnt ) // [INPUT] Sun Pulse Counter (0-3) // (return) Header: Data ID 0:DPB 1:SWP-X1 2:SWP-X2 3:SWP-Y1 4:SWP-Y2 8:SPB <0:error { int i_pacLoc; // Location of the Packet head // unsigned int ui_dataTi; // Header: TI unsigned short us_dataSunc; // Header: Sun counter int i_dataId; // Data-ID int i_dataSize; // Data Size4 // int i_size; // Data Size unsigned int ui_spinCount; // SpinCount // ------------------------------------------ // --- Init: Location of the Packet Start --- // ------------------------------------------ i_pacLoc = 16 + i_pacNo * 2592; // RMAP-Write-Head [16B (Read:12B)] + Packet-size(2592B) x N // ------------------ // --- HEADER:10B --- // ------------------ memcpy( &ui_dataTi, &(uc_data[i_pacLoc]), 4); // B0-3: TI@SunPulse (LSB:2msec) memcpy( &us_dataSunc, &(uc_data[i_pacLoc+4]), 2); // B4-5: delay from SunPulse (LSB:122usec) i_dataId = uc_data[i_pacLoc+6] & 0xF; // B6: 2000,2100,2200,2300,2400,2800 i_dataSize = (int)(uc_data[i_pacLoc+8]<<8) + uc_data[i_pacLoc+9]; // B8-9: DATA SIZE // ------------ // --- DATA --- // ------------ uc_sunpulseCnt++; // Add to [1]-[4] if ( i_dataId==0 ) { // *********** // ****DPB**** // *********** if (i_dataSize > 2560) return(-1); // ==== ERROR -1: Wrong size (DPB) i_size = Gus_EFD_DPB_Size [uc_sunpulseCnt-1]; memcpy( &(Gs_EFD_DPB_Data[i_size][0]), &(uc_data[i_pacLoc+10]), i_dataSize); Gus_EFD_DPB_Size [uc_sunpulseCnt] = i_size + i_dataSize/4; // MAX: 640 = 128Hz x 5sec (x2ch x2B) Gui_EFD_DPB_Ti [uc_sunpulseCnt] = ui_dataTi; Gus_EFD_DPB_TiSun[uc_sunpulseCnt] = us_dataSunc >> 4; // LSB: 2msec // Gui_EFD_DPB_Ti [uc_sunpulseCnt] += Gus_EFD_DPB_TiSun[uc_sunpulseCnt]; } else if ( i_dataId == 8 ) { // *********** // ****SPB**** // *********** if (i_dataSize > 1280) return(-2); // ==== ERROR -2: Wrong size (SPB) i_size = Gus_EFD_SPB_Size [uc_sunpulseCnt-1]; memcpy( &(Gs_EFD_SPB_Data[i_size][0]), &(uc_data[i_pacLoc+10]), i_dataSize); Gus_EFD_SPB_Size [uc_sunpulseCnt] = i_size + i_dataSize/8; // MAX: 160 = 32Hz x 5sec (x4ch x2B) Gui_EFD_SPB_Ti [uc_sunpulseCnt] = ui_dataTi; Gus_EFD_SPB_TiSun[uc_sunpulseCnt] = us_dataSunc >> 4; // LSB: 2msec // Gui_EFD_SPB_Ti [uc_sunpulseCnt] += Gus_EFD_SPB_TiSun[uc_sunpulseCnt]; } else if ( i_dataId > 0 && i_dataId < 5 ) { // ************* // ****SWEEP**** // ************* if (i_dataSize != 1024) return(-3); // ==== ERROR -3: Wrong size (SWEEP) Gus_EFD_SWEEP_Size = 10+i_dataSize; ui_dataTi += app_ti_spinRate ( ui_dataTi, Gd_N_EWO, &ui_spinCount ); // Normal: 4-5sec, Error:4secadded: 111224 Gui_EFD_SWEEP_Ti = ui_dataTi + (us_dataSunc >> 4); memcpy( G13uc_packet, &(uc_data[i_pacLoc]), Gus_EFD_SWEEP_Size); } else { // ************* // ****Error**** // ************* i_dataId = -4; // ==== ERROR -4: Wrong ID ==== } return(i_dataId); } // =========================================================================== // app13_EFD_setTriggerDPB ----- set Trigger-Buffer data (|E|) ----- // input unsigned char uc_sunpulseCnt 0-3 // ----------------------------------------------------------------------- // from Guc_EFD_DPB_ena b0:X b1:Y // Gs_EFD_DPB_Data[2560][2]; 0:Y 1:X // Gus_EFD_DPB_Size // Gui_EFD_DPB_Ti[uc_sunpulseCnt] // ---------------------------------------------------------------------------------------------------- // to Gus_TRG2_EFD_E[i_TRG_cnt] // EFD - |E| (0-500mV/m) 0->+MAX:0000->FFFF // to Gus_TRG2_EFD_Erms[i_TRG_cnt] // EFD - |E|rms (0-500mV/m) 0->+MAX:0000->FFFF // =========================================================================== void app13_EFD_setTriggerDPB( unsigned char uc_sunpulseCnt) { int i, j; int i_num; int i_TRG_cnt; int i_size1, i_size2; int i_phase, i_phase0; short s_data; uc_sunpulseCnt++; // Add to [1]-[4] // ******************* // **** Search TI **** // ******************* if ( Gus_EFD_DPB_Size[uc_sunpulseCnt] == 0) return; i_TRG_cnt = app_tiTrgSearch ( Gui_EFD_DPB_Ti[uc_sunpulseCnt], Gd_N_EWO ); if (i_TRG_cnt < 1) return; // ********************* // **** Phase-Angle **** // ********************* i_phase0 = Gui_EFD_DPB_Ti[uc_sunpulseCnt] - Gui_EFD_DPB_Ti[uc_sunpulseCnt-1]; if ( i_phase0 < 2048 || i_phase0 > 2560 ) return; i_phase0 = 360 * Gus_EFD_DPB_TiSun[uc_sunpulseCnt] / i_phase0; // ********************* // **** Search Data **** // ********************* i_num = 0; i_size1 = Gus_EFD_DPB_Size[uc_sunpulseCnt-1]; i_size2 = Gus_EFD_DPB_Size[uc_sunpulseCnt]; for (i=i_size1; i> j) & 0x01 ) { // Gs_EFD_DPB_Data[2560][2] --- DPB data 0:Y 1:X if ( app13_EFD_ang( 2*j, i_phase ) && app13_EFD_ang( 1+2*j, i_phase )) { // Not eclipse? --- 0&1:X 1&2:Y s_data = Gs_EFD_DPB_Data[i][1-j]; if (s_data<0) s_data *= -1; Gs_EFD_work[i_num++] = s_data; } } } } if (i_num<1) return; // ***************** // **** Get ave **** // ***************** // EFD - |E| (0-500mV/m) 0->+MAX:0000->FFFF j = app13_EFD_ave( Gs_EFD_work, i_num ); for (i=0; i+MAX:0000->FFFF if (i_num > 16) { for (i=0; i+MAX:0000->7FFF -1->-MAX:FFFF->8000) // =========================================================================== void app13_EFD_setTriggerSPB( unsigned char uc_sunpulseCnt ) { int i, j, k; int i_num; int i_TRG_cnt; int i_size1, i_size2; int i_phase, i_phase0; int i_sign; uc_sunpulseCnt++; // Add to [1]-[4] // ****************** // **** no data? **** // ****************** if ( Gus_EFD_SPB_Size[uc_sunpulseCnt] == 0) return; i_TRG_cnt = app_tiTrgSearch ( Gui_EFD_SPB_Ti[uc_sunpulseCnt], Gd_N_EWO ); if (i_TRG_cnt < 1) return; // ********************* // **** Phase-Angle **** // ********************* i_phase0 = Gui_EFD_SPB_Ti[uc_sunpulseCnt] - Gui_EFD_SPB_Ti[uc_sunpulseCnt-1]; if ( i_phase0 < 2048 || i_phase0 > 2560 ) return; i_phase0 = 360 * Gus_EFD_SPB_TiSun[uc_sunpulseCnt] / i_phase0; // ********************* // **** Search Data **** // ********************* i_num = 0; i_size1 = Gus_EFD_SPB_Size[uc_sunpulseCnt-1]; i_size2 = Gus_EFD_SPB_Size[uc_sunpulseCnt]; for (i=i_size1; i> j) & 0x01 ) { if ( app13_EFD_ang( j, i_phase ) ) { // Not eclipse?: b0:X1 b1:X2 b2:Y1 b3:Y2 Gs_EFD_work[i_num++] = i_sign * Gs_EFD_SPB_Data[i][k]; } } } } if (i_num<1) return; // no proper data // ***************** // **** Get ave **** // ***************** Gs_TRG2_EFD_Pot[i_TRG_cnt] = app13_EFD_ave( Gs_EFD_work, i_num ); // EFD - Potential (+-100V: 0->+MAX:0000->7FFF -1->-MAX:FFFF->8000 return; } // ============================================================================================================================= // ============================================================================================================================= // app13_EFD_SPB ----- set SPB L/M packet data ----- // [OUTPUT] unsigned char uc_dataM[] M Data // unsigned char uc_dataL[] L Data // int * ip_MSize M Data Size (B) // int * ip_LSize L Data Size (B) // ----------------------------------------------------------------------- // from Guc_EFD_SPB_ena // Gs_EFD_SPB_Data [i][0:Y1 1:X1 2:Y2 3:X2] 32Hz // Gus_EFD_SPB_Size // Gui_EFD_SPB_Ti [uc_sunpulseCnt] // =========================================================================== int app13_EFD_SPB( unsigned char uc_dataM[], // [OUTPUT] M Data unsigned char uc_dataL[], // [OUTPUT] L Data int * ip_MSize, // M Data Size int * ip_LSize ) // L Data Size { int i, j, k; int i_Mnum, i_Lnum; i_Mnum = i_Lnum = 0; (*ip_MSize) = (*ip_LSize) = 5; // Header Size: 5B // **** DATA **** // Guc_EFD_SPB_ena M: B4:WPT-S1(0x10) B5:WPT-S2(0x20) B6:MEF-S1(0x40) B7:MEF-S2(0x80) << HK >> // L&TRG: B0:WPT-S1(0x11) B1:WPT-S2(0x22) B2:MEF-S1(0x44) B3:MEF-S2(0x88) for (j=0; j<4; j++) { // j 0:X1 1:X2 2:Y1: 3:Y2 if (j==0) k=1; // 1:WPT-S1 else if (j==1) k=3; // 3:WPT-S2 else if (j==2) k=0; // 0:MEF-S1 else k=2; // 2:MEF-S2 if ( (Guc_EFD_SPB_ena >> j) & 0x10 ) { app13_EFD_SPBpacket( Gui_EFD_SPB_Ti[0], k, Gus_EFD_SPB_Size[4], & uc_dataM[ *ip_MSize ], ip_MSize, & i_Mnum, & uc_dataL[ *ip_LSize ], ip_LSize, & i_Lnum, (Guc_EFD_SPB_ena >> j) & 0x01 ); } } // ****************** // ***** HEADER ***** // ****************** // B0 Num of data per 1ch (Nch: not size [16-20sec = 128-160]) uc_dataM[ 0 ] = (unsigned char)i_Mnum; uc_dataL[ 0 ] = (unsigned char)i_Lnum; // B1 b4-7 DATA ENA/DIS (b4:WPT1 b5:WPT2 b6:MEF1 b7:MEF2) uc_dataM[ 1 ] = ( Guc_EFD_SPB_ena & 0xF0); uc_dataL[ 1 ] = ((Guc_EFD_SPB_ena << 4) & 0xF0); // b0-3 Spin Interval [3B:MSB] (lsb:1.953msec MAX:8sec) // B2 Spin Interval [3B:2nd & LSB] i = (Gui_EFD_SPB_Ti[3] - Gui_EFD_SPB_Ti[0]) / 3; if (i<2048 || i>=2560) i=0; uc_dataM[ 1 ] += (i >> 8) & 0x0F; uc_dataM[ 2 ] = (unsigned char)i; uc_dataL[ 1 ] += (i >> 8) & 0x0F; uc_dataL[ 2 ] = (unsigned char)i; // B3 b7 H-dump active // b6-0 TI after SunPulse at start (lsb:1.953msec MAX:0.5sec) i = Gus_EFD_SPB_TiSun[0]; if (i>0x7f) i=0x7f; if ( (Gui_TRG_TiStart << 4) < Gui_EFD_SPB_Ti[4] && Gui_EFD_SPB_Ti[0] < (Gui_TRG_TiEnd << 4) ) { i += 0x80; // H-dump } uc_dataM[ 3 ] = uc_dataL[ 3 ] = (unsigned char)i; // B4 b7 AM2P-activate 0:non 1:active // b6 EFD-DPB-L 0:8Hz 1:4Hz // b5 MEF-CAL B19 b6 0:off 1:on // b4 MEF-Pre-PWR B19 b7 0:off 1:on // b3 WPT-Loop B1 b7 0:off 1:on // b2 WPT-Bias B0 b6 0:off 1:on // b1 WPT-Cal B0 b3 0:off 1:on // b0 WPT-Pre-PWR B0 b1 0:off 1:on i = (Guc_EFD_data_status & 0x7F); if ( Gui_AM2P_start_TI < Gui_EFD_SPB_Ti[4] && Gui_EFD_SPB_Ti[0] < Gui_AM2P_end_TI ) i += 0x80; // AM2P-Active uc_dataM[ 4 ] = uc_dataL[ 4 ] = i; // [M:TOTAL] 1ch 5 + 130-162 = 135-167B 163-195B 80bps // 2ch 5 + 260-312 = 265-317B 293-345B 145bps // 3ch 5 + 390-486 = 395-491B 423-519B 212bps // 4ch 5 + 520-648 = 525-653B 553-681B 277bps // // [L:TOTAL] 1ch 5 + 66-82 = 71-87B 99-115B 50bps // 2ch 5 + 132-164 = 137-169B 165-197B 83bps // 3ch 5 + 198-246 = 203-251B 231-279B 116bps // 4ch 5 + 264-328 = 269-333B 297-361B 149bps return(0); } // --------------------------- int app13_EFD_SPBpacket( unsigned int ui_startTi, // [INPUT] Data ID int i_ant, // [0:Y1 1:X1 2:Y2 3:X2] 32Hz int i_size, // [INPUT] Size unsigned char uc_dataM[], // [OUTPUT] Output data set int * ip_MSize, // M Data Size int * ip_Mnum, // M 1-ch num unsigned char uc_dataL[], // [OUTPUT] Output data set int * ip_LSize, // L Data Size int * ip_Lnum, // M 1-ch num unsigned char uc_Lmode ) // [INPUT] L-mode ena/dis { int i, j; int i_num_j = 0; int i_num0; int i_offset; short s_offset, s_shift; unsigned short us_peak, us_amp; unsigned char uc_dTi; int i_mode, i_int, j_int; unsigned int ui_TIs, ui_TIe; short s_data[4]; int i_sign = 1; // 0:Y1 2:Y2 if (i_ant % 2) i_sign = -1; // 1:X1 3:X2 // ******************************************************************************************** // *** <<<>> // *** Timing: 衛星 TI=0 を起点 8Hz データ: 0.125 N + 0.0625 sec [TI(1.95msec): 64個分] 4点平均 max: // *** Data-interval 32Hzデータ: TI = 16steps分 // *** // *** <<<>> // *** Timing: 衛星 TI=0 を起点 1Hz データ: 1.000 N + 0.5000 sec [TI(1.95msec): 512個分] 32点平均 max: // *** Data-interval 32Hzデータ: TI = 64steps分 // ******************************************************************************************** for (i_mode=0; i_mode<2; i_mode++) { i_int = 4 + 28*i_mode; // M: 4 L: 32 [Data point unit] j_int = i_int * 16; // M: 64 L: 512(1sec) [TI unit] ui_TIs = Gui_EFD_SPB_Ti[0] - (Gui_EFD_SPB_Ti[0] % 512) + 512; // Start TIME [TI 1 sec単位] ui_TIe = Gui_EFD_SPB_Ti[4] - (Gui_EFD_SPB_Ti[4] % 512) + 512; // End TIME [TI 1 sec単位] i_num0 = (ui_TIe - ui_TIs) / j_int; // Length [Data point unit] if (i_num0<=0) return(0); // no data // uc_dTi = ui_startTi % 512; // 1 sec単位の超過分 [TI unit] if (uc_dTi>0) uc_dTi = (512 - uc_dTi) / 16; // 実効処理start点 [Data point unit] i_offset = i_num_j = 0; for (i=uc_dTi; i= i_num0) break; } // OFFSET & SHIFT s_offset = (short)( i_offset / i_num0 ) & 0xFFF0; // OFFSET us_peak = 0; for (i=0; i s_offset) us_amp = Gs_EFD_work[i] - s_offset; else us_amp = s_offset - Gs_EFD_work[i]; if (us_amp > us_peak) us_peak = us_amp; Gs_EFD_work[i] -= s_offset; } for (i=9; i>0; i--) if ( (us_peak & (0x40 << i)) != 0) break; s_shift = i; if (s_shift) { j = (1 << s_shift); if (j>0) for (i=0; i>8 ); // B0: OFFSET (16bit MSB) uc_dataM[ 1 ] = (unsigned char)((s_offset & 0xF0) ) + // B1: b4-7 OFFSET (16bit LSB) (unsigned char)((s_shift & 0x0F) ); // b0-3 Bitshift (4bit) for (i=0; i>8 ); // B0: OFFSET (16bit MSB) uc_dataL[ 1 ] = (unsigned char)((s_offset & 0xF0) ) + // B1: b4-7 OFFSET (16bit LSB) (unsigned char)((s_shift & 0x0F) ); // b0-3 Bitshift (4bit) for (i=0; i> i) & 0x10 ) { app13_EFD_DPBwave( Gui_EFD_DPB_Ti[0], 1-i, Gus_EFD_DPB_Size[4], &(uc_dataM[ *ip_MSize ]), ip_MSize, & i_Mnum, &(uc_dataL[ *ip_LSize ]), ip_LSize, & i_Lnum, (Guc_EFD_DPB_ena >> i) & 0x01 ); } } // --- 0:SPEC-EX --- // --- 1:SPEC-EY --- for (i=0; i<2; i++) { if ( (Guc_EFD_DPB_ena >> i) & 0x40 ) { app13_EFD_DPBspec( Gui_EFD_DPB_Ti[0], 1-i, Gus_EFD_DPB_Size[4], &(uc_dataM[ *ip_MSize ]), ip_MSize, &(uc_dataL[ *ip_LSize ]), ip_LSize, (Guc_EFD_DPB_ena >> i) & 0x04 ); } } // ****************** // ***** HEADER ***** // ****************** // B0 Num of data per 1ch (Nch: not size [16-20sec = 128-160]) uc_dataM[ 0 ] = i_Mnum & 0xFF; uc_dataL[ 0 ] = i_Lnum & 0xFF; // B1 b4-7 DATA ENA/DIS (b4:WPT-Wave(0x10) b5:MEF-Wave(0x20) b6:WPT-Spec(0x40) b7:MEF-Spec(0x80)) uc_dataM[ 1 ] = ( Guc_EFD_DPB_ena & 0xF0); uc_dataL[ 1 ] = ((Guc_EFD_DPB_ena << 4) & 0xF0); // b0-3 Spin Interval [3B:MSB] (lsb:1.953msec MAX:8sec) // B2 Spin Interval [3B:2nd & LSB] i = (Gui_EFD_DPB_Ti[3] - Gui_EFD_DPB_Ti[0]) / 3; if (i<2048 || i>=2560) i=0; uc_dataM[ 1 ] += (i >> 8) & 0x0F; uc_dataM[ 2 ] = i & 0xFF; uc_dataL[ 1 ] += (i >> 8) & 0x0F; uc_dataL[ 2 ] = i & 0xFF; // B3 b7 H-dump active // b6-0 TI after SunPulse at start (lsb:1.953msec MAX:0.5sec) i = i - Gus_EFD_DPB_TiSun[0]; if (i>0x7f) i=0x7f; if (i<0) i=0x00; if ( (Gui_TRG_TiStart << 4) < Gui_EFD_DPB_Ti[4] && Gui_EFD_DPB_Ti[0] < (Gui_TRG_TiEnd << 4) ) { i += 0x80; // H-dump } uc_dataM[ 3 ] = uc_dataL[ 3 ] = (unsigned char)(i & 0xFF); // B4 // b7 AM2P-activate // b6 EFD-status // b5 MEF-CAL B19 b6 0:off 1:on // b4 MEF-Pre-PWR B19 b7 0:off 1:on // b3 WPT-Loop B1 b7 0:off 1:on // b2 WPT-Bias B0 b6 0:off 1:on // b1 WPT-Cal B0 b3 0:off 1:on // b0 WPT-Pre-PWR B0 b1 0:off 1:on i = Guc_EFD_data_status; if ( Gui_AM2P_start_TI < Gui_EFD_DPB_Ti[4] && Gui_EFD_DPB_Ti[0] < Gui_AM2P_end_TI ) i = (i & 0x7F) + 0x80; // AM2P-Active uc_dataM[ 4 ] = uc_dataL[ 4 ] = i; // [M:TOTAL] 1ch 5 + 130-162 = 135-167B 163-195B 80bps // 2ch 5 + 260-312 = 265-317B 293-345B 145bps // 3ch 5 + 390-486 = 395-491B 423-519B 212bps // 4ch 5 + 520-648 = 525-653B 553-681B 277bps // // [L:TOTAL] 1ch 5 + 66-82 = 71-87B 99-115B 50bps // 2ch 5 + 132-164 = 137-169B 165-197B 83bps // 3ch 5 + 198-246 = 203-251B 231-279B 116bps // 4ch 5 + 264-328 = 269-333B 297-361B 149bps return(0); } // --------------------------- int app13_EFD_DPBwave( unsigned int ui_startTi, // [INPUT] Data TI - start int i_ant, // 0:Y 1:X int i_size, // Size unsigned char uc_dataM[], // [OUTPUT] Output data set int * ip_MSize, // M Data Size int * ip_Mnum, // M 1-ch num unsigned char uc_dataL[], // [OUTPUT] Output data set int * ip_LSize, // L Data Size int * ip_Lnum, // M 1-ch num unsigned char uc_Lmode ) // [INPUT] L-mode ena/dis { int i, j, k; int i_num_j = 0; int i_num0 = 0; int i_offset; short s_offset, s_shift; unsigned short us_peak, us_amp; unsigned char uc_dTi; unsigned int ui_TIs, ui_TIe; // ******************************************************************************************** // *** Timing: 衛星 TI=0 を起点 8Hz データ: 0.125 N + 0.0625 sec [TI(1.95msec): 64個分] 16点平均 max: // *** Data-interval 128Hzデータ: TI = 4steps分 // ******************************************************************************************** ui_TIs = Gui_EFD_DPB_Ti[0] + (256 - (Gui_EFD_DPB_Ti[0] % 256)); // 2Hz unit division: 256 steps ui_TIe = Gui_EFD_DPB_Ti[4] + (256 - (Gui_EFD_DPB_Ti[4] % 256)); // 2Hz unit division: 256 steps i_num0 = (ui_TIe - ui_TIs) / 64; // Num of data: 必ず偶数に設定 uc_dTi = ui_startTi % 256; // 2Hz = TI 256step の超過分 if (uc_dTi>0) uc_dTi = (256 - uc_dTi) / 4; // 32Hz -> 8Hz step for (i=uc_dTi; i64->32->16->8Hz } for (i=0; i s_offset) us_amp = Gs_EFD_work[i] - s_offset; else us_amp = s_offset - Gs_EFD_work[i]; if (us_amp > us_peak) us_peak = us_amp; Gs_EFD_work[i] -= s_offset; } for (i=9; i>0; i--) if ( (us_peak & (0x40 << i)) != 0) break; s_shift = i; if (s_shift) { j = (1 << s_shift); for (i=0; i>8 ); // B1: OFFSET (16bit MSB) uc_dataL[ 1 ] = (unsigned char)((s_offset & 0xF0) ) + // B2: b4-7 OFFSET (16bit LSB) (unsigned char)((s_shift & 0x0F) ); // b0-2 Bitshift (4bit) k = (1 << ( (Guc_EFD_mode >> 4) & 0x03 )); // b4-5 0x0*:8Hz 0x1*:4Hz 0x2*:2Hz i_num0 /= k; for (i=0; i= i_phase0 ) i_FFTstart = ( i_phaseFFT - i_phase0 ) * i_spinrate / 360 / 4; // (deg)/360 * (i_spinrate[512Hz])/4 else i_FFTstart = ( 90 + i_phaseFFT - i_phase0 ) * i_spinrate / 360 / 4; // 32Hz -- // for (i=0; i<16; i+=2) { j = i_FFTstart + i_FFTinterval * i; if (j + i_FFTinterval < i_size) { for (k=0; k<64; k++) Gs_EFD_work[k] = Gs_EFD_DPB_Data[j+k][i_ant]; i_sizeFFT = app13_EFD_DPB_FFT64( Gs_EFD_work, &(Guc_EFD_FFT0[i][0]) ); } } // ********************** // **** M(2 / 1spin) **** // ********************** for (i=0; i<16; i+=2) for (j=0; j<16; j++) uc_dataM[j+i*8] = Guc_EFD_FFT0[i][ j ]; // 2,4,6,8,10,12,14,16,18,20,22,24 Hz (0-11) // 26-28,30-32,34-36,38-40 Hz (12-3,14-5,16-7,18-9) (*ip_MSize) += 128; if ( uc_Lmode==0 ) return(0); // ********************** // **** L(1 / 4spin) **** // ********************** for (j=0; j<16; j++) { i_data = i_num = Guc_EFD_FFT[j] = 0; for (i=0; i<16; i+=2) { if ( Guc_EFD_FFT0[i][j] ) { i_data += Guc_EFD_FFT0[i][j]; i_num ++; // AVE if ( Guc_EFD_FFT[j] < Guc_EFD_FFT0[i][j] ) Guc_EFD_FFT[j] = Guc_EFD_FFT0[i][j]; // PEAK detection } } if ( i_num ) uc_dataL[j] = (unsigned char)( i_data / i_num ); else uc_dataL[j] = 0x00; } // memcpy( &(uc_dataL[16]), Guc_EFD_FFT, 16); // PEAK (*ip_LSize) += 32; return(0); } // ************************************************************************************* // ************************************************************************************* // ************************************************************************************* // ************************************************************************************* // ================================================================= // Spin Phase WPT-S1 MEF-S1 WPT-S2 MEF-S2 // (SSAS:225deg) (0deg) (90deg) (180deg) (270deg) // Ex+ Ey+ Ex0 Ey- // ----------------------------------------------------------------- // 0(太陽方向) 135 225 315 45 // (日陰) 45 135 225 315 // 30-75 120-165 210-255 300-345 // ----------------------------------------------------------------- // **4点平均** 75-120 165-210 255-300 345-30 // 165-210 255-300 345-30 75-120 // 255-300 345-30 75-120 165-210 // 345-30 75-120 165-210 255-300 // ----------------------------------------------------------------- int app13_EFD_ang( int i_ant, int i_phase ) // ANT: 0-X1 1-X2 2-Y1 3-Y2 { int i_ant_ecl; if ( i_ant == 0 ) i_ant_ecl = 0; // WPT-S1 eclipse angle 45 0deg delay else if ( i_ant == 1 ) i_ant_ecl = 180; // WPT-S2 eclipse angle 225 180deg delay else if ( i_ant == 2 ) i_ant_ecl = 90; // MEF-S1 eclipse angle 135 90deg delay else i_ant_ecl = 360; // MEF-S2 eclipse angle 315 270deg delay i_ant_ecl = (Gus_EWO_Ec_X1ang+i_ant_ecl) % 360; // Gus_EWO_Ec_X1ang: 45deg (cntl by CMD) if ( i_phase < i_ant_ecl-15 || i_phase > i_ant_ecl+30 ) return(1); // Not Eclipse ---- "Eclipse - 15deg + 30deg " を排除 return(0); // in Eclipse } int app13_EFD_DPB_FFT64( short s_data[64], unsigned char uc_FFTdata[32] ) { int i; double f; // Window - BLACKMAN app_EWO_Blackman( s_data, Gf_EFD_work, 64 ); // Calc app_EWO_rfft( Gf_EFD_work, 64, Gf_EFD_re, Gf_EFD_im ); for (i=1; i<33; i++) Gf_EFD_re[i] = Gf_EFD_re[i] * Gf_EFD_re[i] + Gf_EFD_im[i] * Gf_EFD_im[i]; // 2,4,6,8,10,12,14,16,18,20,22,24 Hz (0-11) // 26-28,30-32,34-36,38-40 Hz (12-3,14-5,16-7,18-9) for (i=0; i<16; i++) { if (i<12) f = 20 * app_math_log10( Gf_EFD_re[i+1] ); else f = 20 * app_math_log10( (Gf_EFD_re[12+(i-12)*2+1] + Gf_EFD_re[12+(i-12)*2+2]) / 2.0 ); if ( f <= 1.0 ) f = 1; uc_FFTdata[i] = (unsigned char)f; } return(i); } /* // ================================================================= // Cut MAX/MIN -> Ave // ================================================================= short app13_EFD_ave( short s_data[], int i_num ) { int i; int i_sum = 0; short s_max = -0x7FFF; short s_min = 0x7FFF; // Check if (i_num <= 0) return(0x7FFF); // Calc MAX/MIN for (i=0; i s_data[i]) s_min = s_data[i]; } if (i_num > 2) { i_num -= 2; i_sum -= (s_max + s_min); } i_sum /= i_num; return ( (short)i_sum ); } */ // ================================================================= // Cut 2sigma -> Ave // ================================================================= short app13_EFD_ave( short s_data[], int i_num ) { int i; int i_x; double f_x, f_ave, f_ave2; // Check if (i_num <= 0) return(0x7FFF ); // Calc ave & dispersion f_ave = f_ave2 = 0.0; for (i=0; i= 0.0) f_ave2 = app_math_sqrt( f_ave2 ); else return(0x7FFF); // Calc ave again without 3-sigma error i_x = 0; f_x = 0.0; for (i=0; i (short)( f_ave - f_ave2 * 2) ) { f_x += (double)s_data[i]; i_x ++; } } if (i_x <= 0) return ( (short)f_ave ); f_x /= (double)i_x; return ( (short)f_x ); }