/******************************************************************************* * モジュール名称 :アプリケーション08 * * モジュールラベル :dpu_app08 * * タスク区分 :アプリケーションタスク * * 機能 : * * コーリングシーケンス:void dpu_app08(int mode) * * 引数 :int mode 冗長機能 - Data Collect * * 戻り値 :void * * 使用上の注意 :なし * * エラー処理 :なし * * 作成日・作成者 :2013/3/26 Y.K. * ********************************************************************************/ #include "dpu_api.h" #include "dpu_api_proto.h" #include "app_core.h" #include "app_rdn_core.h" // *** Macro *** int app08_Rdn_Data ( unsigned int , int ); int app08_Rdn_MissionClct( unsigned char, unsigned int ); // ---------ERROR-FLAG--------- // ---------ERROR-FLAG--------- // ---------ERROR-FLAG--------- /* *****DEBUG**** // void app08_putDPU ( unsigned char, unsigned char, unsigned char, unsigned char, unsigned int, unsigned char, unsigned char [], int); *****DEBUG**** */ void dpu_app08(int mode) { #ifdef _APP_RDN_ int i_flag; int i_slot; // Slot No.: 0-7 unsigned int ui_SecCounter = 0; dpu_waitProcessingSlot(32); // *********************************** // *** EXECUTE @ RDN: DATA collect *** // *********************************** if (Guc_dpuRdn) { for (;;) { for (i_slot = 0; i_slot<8; i_slot ++) { // ************ // *** Slot *** // ************ // i_slot = dpu_waitProcessingSlot(0); i_flag = dpu_waitProcessingSlot(0); if (Guc_dpuRdn==2) { if ( ( Guc_RDN_MemDump_NID & 0x80 ) ==0 && ( Guc_RDN_MemLoad_NID & 0x80 ) ==0 ) { // i_flag = app08_Rdn_Data( ui_SecCounter, (i_slot % 8) ); i_flag = app08_Rdn_Data( ui_SecCounter, i_slot ); } } // if (i_slot == 7) ui_SecCounter++; } ui_SecCounter++; if (Guc_WDTena) { dpu_setWDT( 800 ); dpu_WDTEna(1); } else dpu_WDTEna(0); // WDT: ENA(64sec) / DIS dpu_getCommand( Guc_cmdDummy, &i_flag); } } dpu_WDTEna(0); // WDT: DIS #endif //_APP_RDN_ dpu_appStop(); // *** End *** } #ifdef _APP_RDN_ // *********************** // *** CMD-Exec in RDN *** // *********************** // (1) rap_sv_sendRdnMissionCollect()をコールし、ミッション機器へミッションデータ収集のRMAP ReadCommand を送信する。 // (2) dpu_delay()をコールし、IRD に規定されたCPU-INT だけ待機する。 // (3) rap_sv_getRdnMisIfStatus()をコールし、次のレジスタ値を取得する。 [RMAP Read Reply0 受信個数] // (4) (3)で取得したレジスタ値から、ミッションデータ内容に異常が無いかチェックする。 // (5) 連続収集する場合、(1)を繰り返す。 // // // [DPU1側] // Slot-0:MGF-O // Slot-1:MEA1 // Slot-2:MEA2 // Slot-3:MIA // Slot-4:MSA // Slot-5:HEP-E // Slot-6:HEP-I // Slot-7:ENA // DPU2側 // Slot-0:MGF-I // Slot-1:SORBET // Slot-2:MSASI // Slot-3:MDM // ---------------------------------------------------------------------------------------------------------- int app08_Rdn_Data( unsigned int ui_SecCounter, int i_slot ) { int i_flag = 0x80; if (Guc_dpuNo==0) { // *** from DPU1 to DPU2 i_slot += Gd_N_MGFI; if ( i_slot>Gd_N_MSAS && i_slot!=Gd_N_SOR ) return(0x70); } else { i_slot += Gd_N_MEA1; } if ( Guc_rdn_missionClct[i_slot] && Guc_HK_link[i_slot]) i_flag = app08_Rdn_MissionClct( i_slot, ui_SecCounter ); return ( i_flag ); } // **************************************** // *** MISSION DATA CLCT @ sec-interval *** // **************************************** // --------------------------------------------------------------------------------------------------------- int app08_Rdn_MissionClct( unsigned char uc_nodeId, unsigned int ui_SecCounter ) { M_T_RDN_MIS_IF_STATUS t_misIfStatus; M_T_TIME_INFO t_timeInfo; // unsigned int ui_currentTime; :衛星時刻(1LSB=1.953ms) // unsigned int ui_currentTime2; :衛星時刻(1LSB=31.25ms) // unsigned int ui_sunpulseTime; :SUNPULSE 受信時刻(1LSB=1.953ms) int i_flag, i_latest; int i; int i_SecInterval; // (-2) Interval check if ( uc_nodeId < Gd_N_MEA1 || uc_nodeId > Gd_N_SOR || uc_nodeId == Gd_N_EWO || uc_nodeId == Gd_N_EWO+1 ) return(0xFF); if ( uc_nodeId == Gd_N_MDM ) i_SecInterval = 60; else if ( uc_nodeId == Gd_N_MEA1 || uc_nodeId == Gd_N_MEA2 ) i_SecInterval = 2; else if ( uc_nodeId == Gd_N_MSA || uc_nodeId == Gd_N_HEPI || uc_nodeId == Gd_N_MGFO || uc_nodeId == Gd_N_MGFI ) i_SecInterval = 1; else i_SecInterval = 4; if ( ui_SecCounter % i_SecInterval ) return(0xFE); // not specific timing // *** MONITOR *** i_flag = dpu_getTime( &t_timeInfo ); Gus_rdn_TlmCnt[uc_nodeId] ++; // Mission Collect counter Gus_rdn_TlmDT [uc_nodeId] = t_timeInfo.ui_currentTime2 - Gui_rdn_TlmTi [uc_nodeId]; // Mission Collect TI interval (min:1/32sec) Gui_rdn_TlmTi [uc_nodeId] = t_timeInfo.ui_currentTime2; // Mission Collect TI (min:1/32sec) // (0) Write pointerの決定 OVWかどうかの確認 if ( Guc_rdn_missionOvw[uc_nodeId] == 0 ) { if ( Gt_rdnBLOCK[uc_nodeId].uc_BlockLatest >= Gt_rdnBLOCK[uc_nodeId].uc_BlockNumMax-2 && Gt_rdnBLOCK[uc_nodeId].uc_BlockOldest == 0 ) return(1); // OVW DIS if ( Gt_rdnBLOCK[uc_nodeId].uc_BlockLatest >= Gt_rdnBLOCK[uc_nodeId].uc_BlockOldest-2 && Gt_rdnBLOCK[uc_nodeId].uc_BlockLatest < Gt_rdnBLOCK[uc_nodeId].uc_BlockOldest ) return(2); // OVW DIS } // ----------------------------------------------------------------------------------------- // Write Pointer [block] i_latest = Gt_rdnBLOCK[uc_nodeId].uc_BlockWrite; // WROTE-BLOCK Gt_rdnBLOCK[uc_nodeId].uc_BlockWrite = ( i_latest + 1 ) % Gt_rdnBLOCK[uc_nodeId].uc_BlockNumMax; // WRITING-BLOCK // (1) rap_sv_sendRdnMissionCollect()をコールし、ミッション機器へミッションデータ収集のRMAP ReadCommand を送信する。 for (i=0; i<100; i++) { i_flag = rap_sv_getRdnMisIfStatus( uc_nodeId, &t_misIfStatus ); // t_misIfStatus.us_singleSendCtl :非定期コマンド送信コントロールレジスタ // t_misIfStatus.us_multiSendCtl :定期コマンド送信コントロール・レジスタ // t_misIfStatus.us_multiSendSet :定期コマンド送信設定・レジスタ // t_misIfStatus.us_recvStatus :RMAP 受信ステータス・レジスタ // t_misIfStatus.us_readRply0Cnt :RMAP Read Reply0 受信個数・レジスタ // t_misIfStatus.ui_readRply0Addr :DMA 転送先アドレス0(Read Reply0 用)・レジスタ // t_misIfStatus.us_readRply1Cnt :RMAP Read Reply1 受信個数・レジスタ // t_misIfStatus.ui_readRply1Addr :DMA 転送先アドレス1(Read Reply1 用)・レジスタ // t_misIfStatus.us_writeRplyCnt :RMAP Write Reply 受信個数・レジスタ // t_misIfStatus.us_writeCmdCnt :RMAP Write Command 受信個数・レジスタ // t_misIfStatus.us_lowerLimit :転送先アドレスLower Limit 設定・レジスタ // t_misIfStatus.us_upperLimit :転送先アドレスUpper Limit 設定・レジスタ // t_misIfStatus.us_recvBuffEdac :RCV Buffer EDAC エラーステータス・レジスタ if (i_flag) return( i_flag ); // dpu_app08.cの142行目にて取得したus_multiSendCtlのbit0が'1'の場合、 // 定期コマンドを発行しない if ( (t_misIfStatus.us_multiSendCtl & 0x01) == 0 ) break; // dpu_delay(1); } if (i<100) { // (1) rap_sv_sendRdnMissionCollect()をコールし、ミッション機器へミッションデータ収集のRMAP ReadCommand を送信する。 rap_sv_sendRdnMissionCollect( uc_nodeId, Gt_rdnBLOCK[uc_nodeId].ui_AddStart + Gt_rdnBLOCK[uc_nodeId].uc_BlockWrite * Gi_SizeBlk[uc_nodeId] ); } // (3) rap_sv_getRdnMisIfStatus()をコールし、次のレジスタ値を取得する。 [RMAP Read Reply0 受信個数] // (4) (3)で取得したレジスタ値から、ミッションデータ内容に異常が無いかチェックする。 i_flag = dpu_getTime( &t_timeInfo ); Gt_rdnBLOCK[uc_nodeId].ui_createTime[ i_latest ] = t_timeInfo.ui_currentTime2; Gt_rdnBLOCK[uc_nodeId].i_replyNum [ i_latest ] = Gt_rdnBLOCK[uc_nodeId].us_BlockPacNum; Gt_rdnBLOCK[uc_nodeId].c_invalidFlg [ i_latest ] = 0; if ( t_misIfStatus.us_readRply0Cnt < Gt_rdnBLOCK[uc_nodeId].us_BlockPacNum || i>=100 ) { Gt_rdnBLOCK[uc_nodeId].i_replyNum [ i_latest ] = t_misIfStatus.us_readRply0Cnt; Gt_rdnBLOCK[uc_nodeId].c_invalidFlg [ i_latest ] = 1; // Invalid Flag of each Block } // Latest Block (WROTE) & Oldest Block (Writing) Gt_rdnBLOCK[uc_nodeId].uc_BlockLatest = i_latest; // WROTE BLOCK if (Gt_rdnBLOCK[uc_nodeId].uc_BlockOldest != 0 || i_latest >= Gt_rdnBLOCK[uc_nodeId].uc_BlockNumMax - 2 ) { Gt_rdnBLOCK[uc_nodeId].uc_BlockOldest = ( i_latest + 2 ) % Gt_rdnBLOCK[uc_nodeId].uc_BlockNumMax; // OLDEST BLOCK } /* *************** // *****DEBUG***** // *************** // ---------TMP: MONITOR-PACKET--------- // ---------TMP: MONITOR-PACKET--------- // ---------TMP: MONITOR-PACKET--------- unsigned char uc_packet[8]; uc_packet[0] = uc_nodeId; uc_packet[1] = i_flag; uc_packet[2] = t_misIfStatus.us_readRply0Cnt; uc_packet[3] = i; memcpy( &(uc_packet[4]), &(t_timeInfo.ui_currentTime2), 4); app08_putDPU ( Gd_N_DPU2, 0, Gd_N_DPU2, uc_nodeId, t_misIfStatus.ui_readRply0Addr, 4, uc_packet, 8 ); // ---------TMP: MONITOR-PACKET--------- // ---------TMP: MONITOR-PACKET--------- // ---------TMP: MONITOR-PACKET--------- // *************** // *****DEBUG***** // *************** */ return(i); } /* // *****DEBUG***** // =========================================================================== // app08_putDPU // [INPUT] unsigned char uc_nodeId Node ID // unsigned char uc_dataId Data ID // unsigned char uc_headId Head ID // unsigned char uc_pacId Packet ID // unsigned int ui_dataTi Header: TI // unsigned char uc_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 app08_putDPU( unsigned char uc_nodeId, // [INPUT] Node ID unsigned char uc_dataId, // [INPUT] Data ID unsigned char uc_headId, // [INPUT] Head ID unsigned char uc_pacId, // [INPUT] Packet ID (user defined) unsigned int ui_dataTi, // [INPUT] TI unsigned char uc_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_TLMm_cmp = Guc_TLMm_cmp[uc_headId]; // --------------------------------------------------- // --- Non-Comp / JPEG-Rev / Pre-Compressed Packet --- // --------------------------------------------------- i_flag = app_PutTlm( 5, // [INPUT] APP-NUM = 5 uc_nodeId, // [INPUT] Node-ID uc_dataId, // [INPUT] Data-ID uc_headId, // [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_TLMm_cmp, // [INPUT] Comp mode [0:non 1:JPEG-rev 2:JPEG-nonrev 3:After-User-COMP] uc_pacId, // [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; } // *****DEBUG****** */ #endif // _APP_RDN_