/******************************************************************************* * モジュール名称 :Application Common関数定義 * * モジュールラベル :Common App * * タスク区分 :Common Functions * * 機能 :MWをラップする共通関数定義を行う * * 使用上の注意 :特になし * * 作成日・作成者 :2015/5/6 Y.K. * *******************************************************************************/ #include "dpu_api.h" #include "dpu_api_proto.h" #include "app_core.h" #include "app_rdn_core.h" #include "app_comp_rice.h" #define d_fmHeaderLen 10 // ************************************** // ************* TI:CALC *************** // ************************************** // =========================================================================== // app_ti_spinRate **** そのTIに該当するSpin Rate & Counter を返す **** // [INPUT] unsigned int ui_ti (LSB:1/512sec) // unsigned char uc_nodeId Node Id // unsigned int ui_spinCounter // [return] unsigned int Sun Pulse interval (LSB:1/512sec) // =========================================================================== unsigned int app_ti_spinRate ( unsigned int ui_ti, unsigned char uc_nodeId, unsigned int * ui_spinCount ) { unsigned int i, i_max = Gd_TRG_MAX; if (ui_ti == 0) i_max = 2; for (i=1; i= 0x800 && i<= 0xA00 ) return ( i ); // 1spin else return ( 0x800 ); // 4sec } // =========================================================================== // app_tiTrgSearch **** TIがマッチするTrigger timingを探す **** // [INPUT] unsigned int ui_ti (LSB:1/512sec) // unsigned char uc_nodeId Node Id // [return] int trigger ID counter (error: -1) // =========================================================================== int app_tiTrgSearch ( unsigned int ui_ti, unsigned char uc_nodeId ) { int i; for (i=0; i> uc_location ); uc_reg &= uc_mask; uc_reg <<= uc_shift; return( uc_reg ); } unsigned char app_1bit( unsigned char uc_data ) { if ( uc_data ) return( 1 ); return( 0 ); } /* // =========================================================================== // app_bit2uc **** Bit切り出し書込 **** // [INPUT] unsigned char uc_info Write data // unsigned char uc_mask bit mask (0x01-0xFF) // unsigned char uc_location bit location (0:LSB 7:MSB) // [OUTPUT] unsigned int uc_data modified from original data // =========================================================================== void app_bit2uc( unsigned char uc_info, unsigned char uc_mask, unsigned char uc_location, unsigned char * ucp_data) { unsigned char uc_reg; unsigned char uc_mask_data; uc_mask_data = (unsigned char)( 0x100 - uc_mask ); uc_mask_data &= (*ucp_data); uc_reg = ( ( uc_info & uc_mask) << uc_location ); (*ucp_data) = uc_mask_data + uc_reg; } */ // **************************************** // ************* HK:読出し *************** // **************************************** // =========================================================================== // app_HkRead **** 特定Node-IDのHK読出し **** // [INPUT] unsigned char uc_nodeId 対象Node-ID // [OUTPUT] unsigned char uc_data[] HKデータ(DPU以外:128) // [return] int 0:nrm それ以外:error // =========================================================================== int app_HkRead( unsigned char uc_nodeId, // [INPUT] Node-ID unsigned char uc_data[] ) // [OUTPUT] HK-data { int i_flag; #ifdef _APP_RDN_ if ( app_Rdn_nodeId( uc_nodeId ) == 0) { #endif //_APP_RDN_ // --- Non-redundant --- if (uc_nodeId == Gd_N_DPU1 || uc_nodeId == Gd_N_DPU2) { i_flag = dpu_getMwHK( uc_data ); #ifdef _APP_RDN_ Guc_rdn_MwHK[17] = uc_data[17]; // 17 7 0 TASK_STAT_AP01-08 Guc_rdn_MwHK[18] = uc_data[18]; // 18 7 0 TASK_STAT_AP09-16 #endif // _APP_RDN_ } else { i_flag = dpu_getHK( uc_nodeId, uc_data ); } return( -i_flag ); // 0:normal 1:other DPU 2:others #ifdef _APP_RDN_ } else { // --- Redundant --- if (uc_nodeId == Gd_N_DPU1 || uc_nodeId == Gd_N_DPU2) { memcpy( uc_data, Guc_rdn_MwHK, 200); return( 0 ); } else { if (uc_nodeId >= Gd_N_MGFI && uc_nodeId <= Gd_N_MWE && uc_nodeId != Gd_N_EWO+1 ) { memcpy( uc_data, &(Guc_rdn_PiHK[uc_nodeId-Gd_N_MGFI][0]), 128); return( 0 ); } if (uc_nodeId >= Gd_N_MEA1 && uc_nodeId <= Gd_N_MGFO ) { memcpy( uc_data, &(Guc_rdn_PiHK[uc_nodeId-Gd_N_MEA1][0]), 128); return( 0 ); } } } #endif // _APP_RDN_ return(3); } // *************************************** // ************* CMD: 送信 *************** // *************************************** // =========================================================================== // app_PiCmd **** 特定Node-IDへのCMD発行 **** // [INPUT] unsigned char uc_nodeId 対象Node-ID // unsigned char uc_cmdBuff[163] CMD内容 (最大:162B) // int i_cmdSize CMDサイズ (最大:162B) // [return] int 0:nrm それ以外:error // =========================================================================== int app_PiCmd( unsigned char uc_nodeId, // [INPUT] Node-ID unsigned char uc_cmdBuff[163], // [INPUT] Cmd Buffer (<100) int i_cmdSize) // [INPUT] Cmd Size { int i_flag; M_T_TIME_INFO t_timeInfo; // unsigned int ui_currentTime; :衛星時刻(1LSB=1.953ms) // --- CHECK --- Gt_cmdDMC[1].uc_NID = uc_nodeId; Gt_cmdDMC[1].ui_CntlID = (uc_cmdBuff[0]<<8) + uc_cmdBuff[1]; Gt_cmdDMC[1].uc_GetCount ++; // Get Counter (1B: 00-FF) if (i_cmdSize > 162) { Gt_cmdDMC[1].uc_GetErr |= 0x01; // ***ERR-1: CMD-Size overflow return (0xFF); } // ------------- // --- WAIT! --- // ------------- for (;;) { if ( Gi_cmdBusy ==0 ) break; dpu_delay(10); } #ifdef _APP_RDN_ if ( app_Rdn_nodeId( uc_nodeId ) == 0 ) { #endif // _APP_RDN_ // **** Normal **** while (1) { i_flag = dpu_sendMissionCmd ( uc_nodeId, uc_cmdBuff, i_cmdSize ); if (i_flag != -1) break; } #ifdef _APP_RDN_ } else { // **** Redundancy **** i_flag = rap_sv_sendRdnMissionCmd( (int)uc_nodeId, uc_cmdBuff, i_cmdSize); } #endif // _APP_RDN_ // LOG Gt_cmdDMC[1].uc_Ans = -i_flag; if (i_flag == 0) { Gt_cmdDMC[1].uc_ExeCount ++; // Exe Counter (1B: 00-FF) } else { if (uc_nodeId>=Gd_N_MEA1 && uc_nodeId<=Gd_N_MWE) Gt_cmdDMC[1].ui_ExeErr |= (0x00010 << (uc_nodeId - Gd_N_MEA1)); // 0x00010 - 0x80000 else Gt_cmdDMC[1].ui_ExeErr |= 0x00002; } i_flag = dpu_getTime( &t_timeInfo ); Gt_cmdDMC[1].ui_ExeTime = t_timeInfo.ui_currentTime2; // LSB:32msec return( Gt_cmdDMC[1].uc_Ans ); } // =========================================================================== // app_DmcRequestCmd **** DMCへのRequestCMD発行 **** // [INPUT] unsigned char Request Code **CODE** // PCD-MEA1-PSU-OFF 0x08 // PCD-MEA2-PSU-OFF 0x09 // PCD-MIA-PSU-OFF 0x0A // PCD-MSA-PSU-OFF 0x0B // PCD-HEPE-PSU-OFF 0x0C OUT // PCD-HEPI-PSU-OFF 0x0D // PCD-ENA-PSU-OFF 0x0E // MDP1-IPD-ALL-OFF 0x0F OUT // // PCD-MSAS-PSU-OFF 0x18 OUT // PCD-MGFI-PSU-OFF 0x19 OUT // PCD-MDM-PSU-OFF 0x1A OUT // PCD-MTR-PSU-OFF 0x1B // PCD-PME-PSU-OFF 0x1C OUT // MDP2-IPD-ALL-OFF 0x1D OUT // MDP2-IPD-MEF-OFF 0x1E // MDP2-IPD-MWE-OFF 0x1F OUT // // [return] int 0:OK -1:Code error! // =========================================================================== int app_DmcRequestCmd( unsigned char uc_reqCode ) // [INPUT] DMC RequestCode { int i_flag; if ( (uc_reqCode < 0x08 ) || (uc_reqCode == 0x0C ) || (uc_reqCode > 0x0E && uc_reqCode < 0x1B ) || (uc_reqCode > 0x1B && uc_reqCode < 0x1E ) || (uc_reqCode > 0x1E ) ) return(-1); for (;;) { i_flag = dpu_putUserRequest( uc_reqCode ); if (i_flag == 0) break; // -1: send again dpu_delay(10); } return( 0 ); } // ******************************************* // ************* DS: SDRAM操作 *************** // ******************************************* // =========================================================================== // app_CheckNonProcBlock *** "ui_TLM_blockTime" 直後のTIを持ったBlockを有するバッファを探す (Long or Short or Nothing) // [INPUT] unsigned char uc_nodeId Node-ID // unsigned char uc_dataId Data-ID // unsigned int ui_TLM_blockTime 処理済データ(等)のTI // [OUTPUT] unsigned int *uip_TLM_blockTimeNew 当該バッファ最新ブロックのTI // [return] int 選ばれたBuffer-ID (0:L, 1:S, -1:no data) // =========================================================================== int app_CheckNonProcBlock ( unsigned char uc_nodeId, // [INPUT] Node-ID unsigned char uc_dataId, // [INPUT] Data-ID unsigned int ui_TLM_blockTime, // [INPUT] TI of processed data unsigned int *uip_TLM_blockTimeNew) // [OUTPUT] TI of new data { // ------------ // --- Init --- // ------------ int i_flag; // int i_blockNo; // Num of Blocks int i_bufId = -1; // Buffer ID unsigned int ui_blockTime_L = 0xFFFFFFFF; // TI of Long buffer unsigned int ui_blockTime_S = 0xFFFFFFFF; // TI of Short buffer M_T_BLOCK_INFO t_blockInfo; // unsigned int ui_createTime Block 生成開始時衛星時刻(1LSB=31,25ms) // int i_replyNum Block 登録Read-Reply個数 // char c_invalidFlg Block 内データ異常 [0:異常なし 1:異常あり] // unsigned int ui_blockIndex LongBuffer/ShortBuffer 内Block特定番号 (先頭Block:0) #ifdef _APP_RDN_ if ( app_Rdn_nodeId( uc_nodeId ) == 0) { #endif // _APP_RDN_ // ------------------- // --- Long Buffer --- // ------------------- i_flag = dpu_seekNewestBlock( uc_nodeId, uc_dataId, 0, &t_blockInfo ); if ( i_flag == 0 && // no error t_blockInfo.ui_createTime > ui_TLM_blockTime && // Available of New data t_blockInfo.i_replyNum > 0 && // Available of Data t_blockInfo.c_invalidFlg == 0 ) { // Available of Correct Data i_bufId = 0; ui_blockTime_L = t_blockInfo.ui_createTime; } // -------------------- // --- Short Buffer --- // -------------------- i_flag = dpu_seekNewestBlock( uc_nodeId, uc_dataId, 1, &t_blockInfo ); // ****REDUNDANCY-CASE:REVISION in future**** #ifdef _APP_RDN_ } else { i_flag = app_Rdn_seekNewestOldestBlock( uc_nodeId, uc_dataId, 0, &t_blockInfo ); } #endif // _APP_RDN_ if ( i_flag == 0 && // no error t_blockInfo.ui_createTime > ui_TLM_blockTime && // Available of New data t_blockInfo.i_replyNum > 0 && // Available of Data t_blockInfo.c_invalidFlg == 0 ) { // Available of Correct Data i_bufId = 0; ui_blockTime_S = t_blockInfo.ui_createTime; } // -------------------------------- // --- Comparison of Long/Short --- // -------------------------------- if (i_bufId == 0) { if (ui_blockTime_L <= ui_blockTime_S) { *uip_TLM_blockTimeNew = ui_blockTime_L; return(0); // Long buffer is selected. } *uip_TLM_blockTimeNew = ui_blockTime_S; return(1); // Short buffer is selected. } return(-1); // No data } // =========================================================================== // app_SetNonProcBlock ***FUNC*** "ui_TLM_blockTime" 直後のTIを持ったBlockをみつける *** // [INPUT] unsigned char uc_nodeId Node-ID // unsigned char uc_dataId Data-ID // int i_bufId Buffer-ID // unsigned int ui_TLM_blockTime 処理済データ(等)のTI // [OUTPUT] M_T_BLOCK_INFO *tp_blockInfo Block Info // [return] int >0:Num of blocks, <=0:error // =========================================================================== int app_SetNonProcBlock ( unsigned char uc_nodeId, // [INPUT] Node-ID unsigned char uc_dataId, // [INPUT] Data-ID int i_bufId, // [INPUT] Buff-ID unsigned int ui_TLM_blockTime, // [INPUT] TI of processed data M_T_BLOCK_INFO *tp_blockInfo) // [OUTPUT] Block Info { // ------------ // --- Init --- // ------------ int i, j; int i_flag; int i_blockNo; // Num of Blocks #ifdef _APP_RDN_ int i_rdn = app_Rdn_nodeId( uc_nodeId ); #endif // _APP_RDN_ tp_blockInfo->i_replyNum = 0; tp_blockInfo->ui_blockIndex = 0; tp_blockInfo->ui_createTime = 0; tp_blockInfo->c_invalidFlg = 0; // --------------------------------- // *** Block Seek *** // --------------------------------- #ifdef _APP_RDN_ if ( i_rdn == 0) { #endif // _APP_RDN_ i_flag = dpu_getBlockNo ( uc_nodeId, uc_dataId, i_bufId, &i_blockNo ); #ifdef _APP_RDN_ } else { i_flag = app_Rdn_getBlockNo ( uc_nodeId, uc_dataId, &i_blockNo ); } #endif // _APP_RDN_ if ( i_flag || i_blockNo <= 0 ) return(-1); // No data #ifdef _APP_RDN_ if ( i_rdn == 0) { #endif // _APP_RDN_ i_flag = dpu_seekNewestBlock( uc_nodeId, uc_dataId, i_bufId, tp_blockInfo ); #ifdef _APP_RDN_ } else { i_flag = app_Rdn_seekNewestOldestBlock( uc_nodeId, uc_dataId, 0, tp_blockInfo ); } #endif // _APP_RDN_ if ( i_flag ) return(-2); // Error! // --------------------------------- // *** Just-Processed-Block Seek *** // --------------------------------- for (i=i_blockNo-1; i>=0; i--) { if ( tp_blockInfo->ui_createTime <= ui_TLM_blockTime ) { // OLDER break; } if ( i==0 ) break; // To next block #ifdef _APP_RDN_ if ( i_rdn == 0) { #endif // _APP_RDN_ i_flag = dpu_shiftBlock( uc_nodeId, uc_dataId, i_bufId, -1, tp_blockInfo ); #ifdef _APP_RDN_ } else { i_flag = app_Rdn_shiftBlock( uc_nodeId, uc_dataId, -1, tp_blockInfo ); } #endif // _APP_RDN_ if ( i_flag ) return(-3); // Error } if (i<0) return(-4); // No new data j = i; // --------------------------------- // *** New-Block Seek *** // --------------------------------- for (i=j; iui_createTime > ui_TLM_blockTime && // NEW tp_blockInfo->i_replyNum > 0 && // Data available tp_blockInfo->c_invalidFlg == 0 ) { // Data correct return(i_blockNo-i); } // To next block #ifdef _APP_RDN_ if ( i_rdn == 0) { #endif // _APP_RDN_ i_flag = dpu_shiftBlock ( uc_nodeId, uc_dataId, i_bufId, 1, tp_blockInfo ); #ifdef _APP_RDN_ } else { i_flag = app_Rdn_shiftBlock( uc_nodeId, uc_dataId, 1, tp_blockInfo ); } #endif // _APP_RDN_ if ( i_flag ) return(-5); // Error } return(-6); // No new data } // =========================================================================== // app_SetTlmhBlock *** "ui_startTI" のTIを持ったBlockをみつける *** [対象:LONG-BUFFERのみ] // [INPUT] unsigned char uc_nodeId Node-ID // unsigned char uc_dataId Data-ID // unsigned int ui_startTI 指定のBlock TI [0xFFFFFFFF: NEWEST] // [OUTPUT] M_T_BLOCK_INFO *tp_blockInfo Block Info // [return] int >0:Num of blocks, <=0:error // =========================================================================== // ***Prototype: app_common.c*** int app_SetTlmHBlock ( unsigned char uc_nodeId, // [INPUT] Node-ID unsigned char uc_dataId, // [INPUT] Data-ID unsigned int ui_startTI, // [INPUT] TI of Start Block [0xFFFFFFFF:NEWEST] M_T_BLOCK_INFO *tp_blockInfo) // [OUTPUT] Block Info // unsigned int ui_createTime Block 生成開始時衛星時刻(1LSB=31,25ms) // int i_replyNum Block 登録Read-Reply個数 // char c_invalidFlg Block 内データ異常 [0:異常なし 1:異常あり] // unsigned int ui_blockIndex LongBuffer/ShortBuffer 内Block特定番号 (先頭Block:0) // (return) >0:Num of blocks, <=0:No data (error) *** { int i_flag; int i_blockNo; // Num of Blocks int i_blockNo_sel; int i; #ifdef _APP_RDN_ int i_rdn = app_Rdn_nodeId( uc_nodeId ); #endif // _APP_RDN_ // ------------ // --- Init --- // ------------ tp_blockInfo->i_replyNum = tp_blockInfo->ui_blockIndex = tp_blockInfo->ui_createTime = tp_blockInfo->c_invalidFlg = 0; unsigned char uc_headId; uc_headId = uc_nodeId; if (uc_nodeId==Gd_N_EWO && uc_dataId) uc_headId=uc_dataId-1; // ------------------------ // *** Newest-Block Set *** // ------------------------ if (ui_startTI == 0xFFFFFFFF) { #ifdef _APP_RDN_ if ( i_rdn == 0) { #endif // _APP_RDN_ i_flag = dpu_seekNewestBlock( uc_nodeId, uc_dataId, 0, tp_blockInfo ); #ifdef _APP_RDN_ } else { i_flag = app_Rdn_seekNewestOldestBlock( uc_nodeId, uc_dataId, 0, tp_blockInfo ); } #endif // _APP_RDN_ if ( i_flag ) return(-1); // Error else return(1); } // ----------------------------------------------------------------------------------------- // --- Long Buffer: Check --- // -------------------------- #ifdef _APP_RDN_ if ( i_rdn == 0) { #endif // _APP_RDN_ i_flag = dpu_getBlockNo ( uc_nodeId, uc_dataId, 0, &i_blockNo ); #ifdef _APP_RDN_ } else { i_flag = app_Rdn_getBlockNo ( uc_nodeId, uc_dataId, &i_blockNo ); } #endif // _APP_RDN_ if ( i_flag || i_blockNo <= 0 ) return(-2); // Error or No data // ------------------- // --- Long Buffer --- // ------------------- i_blockNo_sel = -2; #ifdef _APP_RDN_ if ( i_rdn == 0) { #endif // _APP_RDN_ i_flag = dpu_seekOldestBlock ( uc_nodeId, uc_dataId, 0, tp_blockInfo ); // LONG-oldest #ifdef _APP_RDN_ } else { i_flag = 0; tp_blockInfo->ui_blockIndex = Gt_rdnBLOCK[uc_headId].uc_BlockOldest; tp_blockInfo->ui_createTime = Gt_rdnBLOCK[uc_headId].ui_createTime[ tp_blockInfo->ui_blockIndex ]; tp_blockInfo->i_replyNum = Gt_rdnBLOCK[uc_headId].i_replyNum [ tp_blockInfo->ui_blockIndex ]; tp_blockInfo->c_invalidFlg = Gt_rdnBLOCK[uc_headId].c_invalidFlg [ tp_blockInfo->ui_blockIndex ]; } #endif // _APP_RDN_ if ( i_flag ) return(-3); // Error for (i=0; ii_replyNum > 0 && tp_blockInfo->c_invalidFlg == 0) if ( ui_startTI <= tp_blockInfo->ui_createTime ) { i_blockNo_sel = i; break; // Start TI } #ifdef _APP_RDN_ if ( i_rdn == 0) { #endif // _APP_RDN_ i_flag = dpu_shiftBlock ( uc_nodeId, uc_dataId, 0, 1, tp_blockInfo ); // next #ifdef _APP_RDN_ } else { i_flag = app_Rdn_shiftBlock( uc_nodeId, uc_dataId, 1, tp_blockInfo ); // OLDER } #endif // _APP_RDN_ if ( i_flag ) return(-5); // Error } // --------------- // *** Return! *** // --------------- if (i_blockNo_sel >= 0) return ( i_blockNo - i_blockNo_sel ); else return ( -6 ); } // =========================================================================== // app_NextBlock // **************************************************************** // ***FUNC*** 次の Block へ移動 // **************************************************************** // [INPUT] unsigned char uc_nodeId Node-ID // unsigned char uc_dataId Data-ID // int i_bufId Buffer-ID // [OUTPUT] M_T_BLOCK_INFO *tp_blockInfo Block Info // [return] int 0:nrm others:error // =========================================================================== int app_NextBlock( unsigned char uc_nodeId, unsigned char uc_dataId, int i_bufId, M_T_BLOCK_INFO *tp_blockInfo ) { int i_flag; // --------------------------------------- // *** Block Seek *** // --------------------------------------- #ifdef _APP_RDN_ if ( app_Rdn_nodeId( uc_nodeId ) == 0) { #endif // _APP_RDN_ i_flag = dpu_shiftBlock( uc_nodeId, uc_dataId, i_bufId, 1, tp_blockInfo ); #ifdef _APP_RDN_ } else { i_flag = app_Rdn_shiftBlock( uc_nodeId, uc_dataId, 1, tp_blockInfo ); // OLDER } #endif // _APP_RDN_ return( i_flag ); } // =========================================================================== // app_GetBlock // **************************************************************** // ***FUNC*** Block DataのSRAM展開 // **************************************************************** // [INPUT] unsigned char uc_appNum Application number (02-05) // unsigned char uc_nodeId Node-ID // unsigned char uc_dataId Data-ID // int i_bufId Buffer-ID // M_T_BLOCK_INFO *tp_blockInfo Block Info // [OUTPUT] unsigned char uc_data[] Block data // [return] int 0:nrm others:error // =========================================================================== int app_GetBlock( unsigned char uc_appNum, // [INPUT] Application number (02-05) unsigned char uc_nodeId, unsigned char uc_dataId, int i_bufId, M_T_BLOCK_INFO *tp_blockInfo, unsigned char uc_data[] ) { int i_flag; volatile int * ip_dmaBusy; unsigned char uc_headId; if (uc_appNum == 3) ip_dmaBusy = & G3i_dmaBusy; // TLM-LM DPU1 else if (uc_appNum == 13) ip_dmaBusy = & G13i_dmaBusy; // TLM-LM DPU2 else if (uc_appNum == 4) ip_dmaBusy = & G4i_dmaBusy; // TLM-LM DPU1 else if (uc_appNum == 14) ip_dmaBusy = & G14i_dmaBusy; // TLM-LM DPU2 else if (uc_appNum == 5) ip_dmaBusy = & G5i_dmaBusy; // TLM-H else return(1); // ---- // EWOE, EWOB, AM2P, MSASI: No Block Read // ---- uc_headId = uc_nodeId; if ( uc_nodeId == Gd_N_EWO && uc_dataId ) uc_headId = uc_dataId - 1; if ( Gi_SizeBlk[uc_headId] >= Gd_dataRawLen ) return (3); // ------------------ // --- !! WAIT !! --- // ------------------ for (;;) { if (*ip_dmaBusy != 1) break; dpu_delay(10); } Gi_dmaBusyTask = (uc_nodeId << 3) + (uc_dataId & 0x3); // BUSY! [(NodeId (b7-3) + DataId (b0-1)] // --- // Block read! // ---- #ifdef _APP_RDN_ if ( app_Rdn_nodeId( uc_nodeId ) == 0) { #endif // _APP_RDN_ i_flag = dpu_getBlock( uc_nodeId, uc_dataId, i_bufId, tp_blockInfo, uc_data, (int *)ip_dmaBusy ); if (i_flag) return(i_flag); for (;;) { if (*ip_dmaBusy != 1) break; dpu_delay(10); } return(0); #ifdef _APP_RDN_ } else { i_flag = app_Rdn_getBlock( uc_nodeId, uc_dataId, tp_blockInfo, uc_data ); *ip_dmaBusy = 0; return (i_flag); } #endif // _APP_RDN_ } // =========================================================================== // app_GetPacket // **************************************************************** // ***FUNC*** Block Data内の「Packetデータ」の一部SRAM展開 // **************************************************************** // [INPUT] unsigned char uc_appNum Application number (02-05) // unsigned char uc_nodeId Node-ID // unsigned char uc_dataId Data-ID // int i_bufId Buffer-ID // M_T_BLOCK_INFO *tp_blockInfo Block Info // int i_packetNo Packet No (先頭:0) // int i_offset 読出開始番地(8の倍数) // int i_dataSize 読出サイズ (8の倍数) // [OUTPUT] unsigned char uc_data[] Block data // [return] int 0:nrm others:error // =========================================================================== int app_GetPacket( unsigned char uc_appNum, // [INPUT] Application number (02-05) unsigned char uc_nodeId, unsigned char uc_dataId, int i_bufId, M_T_BLOCK_INFO *tp_blockInfo, int i_packetNo, int i_offset, int i_dataSize, unsigned char uc_data[] ) { int i_flag; volatile int * ip_dmaBusy; if (uc_appNum == 3) ip_dmaBusy = & G3i_dmaBusy; // TLM-LM DPU1 else if (uc_appNum == 13) ip_dmaBusy = & G13i_dmaBusy; // TLM-LM DPU2 else if (uc_appNum == 4) ip_dmaBusy = & G4i_dmaBusy; // TLM-LM DPU1 else if (uc_appNum == 14) ip_dmaBusy = & G14i_dmaBusy; // TLM-LM DPU2 else if (uc_appNum == 5) ip_dmaBusy = & G5i_dmaBusy; // TLM-H else return(1); // ---- // Size check! // ---- i_dataSize = ((i_dataSize>>3)<<3); if ( i_dataSize >= Gd_dataRawLen ) return (1); i_offset = ((i_offset >>3)<<3); // ------------------ // --- !! WAIT !! --- // ------------------ for (;;) { if (*ip_dmaBusy != 1) break; dpu_delay(10); } // BUSY-FLAG Gi_dmaBusyTask = (uc_nodeId << 3) + (uc_dataId & 0x3) + 0x04; // BUSY! [(NodeId (b7-3) + DataId (b0-1) + 0x04] // --- // Packet read! // ---- #ifdef _APP_RDN_ if ( app_Rdn_nodeId( uc_nodeId ) == 0) { #endif // _APP_RDN_ i_flag = dpu_getReply( uc_nodeId, uc_dataId, i_bufId, tp_blockInfo, i_packetNo, i_offset, i_dataSize, uc_data, (int *)ip_dmaBusy ); if (i_flag) return(i_flag); for (;;) { if (*ip_dmaBusy != 1) break; dpu_delay(10); } return(0); #ifdef _APP_RDN_ } else { i_flag = app_Rdn_getReply( uc_nodeId, uc_dataId, tp_blockInfo, i_packetNo, i_offset, i_dataSize, uc_data); *ip_dmaBusy = 0; return (i_flag); } #endif // _APP_RDN_ } // =========================================================================== // app_ReleaseBlock // **************************************************************** // ***FUNC*** 古い順から「i_blockCnt」個のBlockを削除 // **************************************************************** // [INPUT] unsigned char uc_nodeId Node-ID // unsigned char uc_dataId Data-ID // int i_bufId Buffer-ID 0:L 1:S // int i_blockCnt Num of released blocks -1:all // [return] int 0:nrm others:error // =========================================================================== // ***** ENA-ONLY ***** int app_ReleaseBlock( unsigned char uc_nodeId, unsigned char uc_dataId, int i_bufId, int i_blockCnt ) { int i_flag = 0; // --------------------------------------- // *** Block Seek *** // --------------------------------------- #ifdef _APP_RDN_ int i_num; if ( app_Rdn_nodeId( uc_nodeId ) == 0) { #endif // _APP_RDN_ i_flag = dpu_releaseBlock( (int)(uc_nodeId), (int)(uc_dataId), i_bufId, i_blockCnt ); #ifdef _APP_RDN_ } else if (i_blockCnt>=0) { // ****REDUNDANCY-CASE **** i_num = Gt_rdnBLOCK[uc_nodeId].uc_BlockLatest - Gt_rdnBLOCK[uc_nodeId].uc_BlockOldest; if (i_num < 0) i_num += Gt_rdnBLOCK[uc_nodeId].uc_BlockNumMax; if (i_num < i_blockCnt) i_blockCnt = i_num; // Gt_rdnBLOCK[uc_nodeId].uc_BlockOldest += i_blockCnt; if (Gt_rdnBLOCK[uc_nodeId].uc_BlockOldest >= Gt_rdnBLOCK[uc_nodeId].uc_BlockNumMax) Gt_rdnBLOCK[uc_nodeId].uc_BlockOldest -= Gt_rdnBLOCK[uc_nodeId].uc_BlockNumMax; } #endif // _APP_RDN_ return( i_flag ); } // =========================================================================== // app_PutTlm ---- Non-Compressed & Math-comp telemetry ---- // **************************************************************** // ***FUNC*** Non-compressed / MATH-COMP TLM // **************************************************************** // [INPUT] unsigned char uc_appNum Application number (02-05) // unsigned char uc_dataId Data-ID // unsigned char uc_headId Header-ID (for PID-ID, CAT-ID setting) // unsigned char uc_drId DR-ID (for CAT-ID) [0:HK 1:OS 2:L 3:M 4-9:H(0-5)] // unsigned char uc_cmp Comp mode [0:non 1:ARITH0 2:ARITH1 4:RICE 3:After-User-COMP 5-7:fail] // unsigned char uc_pacId Packet ID <<<< USER-DEF: 0x00- 0xFF >>>> // unsigned int ui_time Data TI <<<< USER-DEF: 0x00000000-0xFFFFFFFF >>>> // unsigned char uc_comment[], Comment <<<< USER-DEF: <128B >>>> // unsigned char uc_sizeComment Comment - Size <<<< USER-DEF: <128B >>>> // unsigned char uc_data[] Data <<<< USER-DEF: <0x1E00 >>>> // int i_sizeData Data - Size <<<< USER-DEF: <0x1E00 >>>> // [return] int 0:nrm others:error // =========================================================================== int app_PutTlm( unsigned char uc_appNum, // [INPUT] Application number (02-05) unsigned char uc_nodeId, // [INPUT] Node-ID unsigned char uc_dataId, // [INPUT] Data-ID unsigned char uc_headId, // [INPUT] Header-ID (for PID-ID, CAT-ID setting) unsigned char uc_drId, // [INPUT] DR-ID (for CAT-ID) [0:HK 1:OS 2:L 3:M 4-9:H(0-5)] unsigned char uc_cmp, // [INPUT] Comp mode [0:non 1(/2):ARITH0 4:RICE 3/5-7:After-User-COMP] unsigned char uc_pacId, // [INPUT] Packet ID <<<< USER-DEF: 0x00- 0xFF >>>> unsigned int ui_time, // [INPUT] Data TI <<<< USER-DEF: 0x00000000-0xFFFFFFFF >>>> unsigned char uc_comment[], // [INPUT] Comment <<<< USER-DEF: <128B >>>> unsigned char uc_sizeComment, // [INPUT] Comment - Size <<<< USER-DEF: <128B >>>> unsigned char uc_data[], // [INPUT] Data <<<< USER-DEF: <0x1E00 >>>> int i_sizeData) // [INPUT] Data - Size <<<< USER-DEF: <0x1E00 >>>> { M_T_CCSDS_HDR_INFO t_ccsdsHdrInfo; // Variable: defined by core us_APID, uc_Category // defined by user uc_PktId M_T_DPU_INFO t_dpuInfo; int i_waitNrm; unsigned short us_sizeData = i_sizeData; int i_FmHeaderLoc; int i_flag; // Busy-flag int i_tlmBusy; unsigned char * ucp_packet; // Arith compress MATH * math; #ifndef _APP_RDN_ int * ip_arithBusy; void * s_comp_totals; #endif // TIME 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) i_flag = dpu_getTime( &t_timeInfo ); // *************** // *** APL Num *** // *************** if ( Guc_hkApp_ID[uc_appNum]<1 || Guc_hkApp_ID[uc_appNum]>6) return(1); app_WhoWhere( Guc_hkApp_ID[uc_appNum], uc_headId, 0xE0 ); // HK // HK if (uc_appNum == 2) { ucp_packet = G2uc_tlm; math = & G2t_math; #ifndef _APP_RDN_ s_comp_totals = G3s_arithTotals; ip_arithBusy = &G3i_arithBusy; #endif } // L/M DPU1 else if (uc_appNum == 3) { ucp_packet = G3uc_tlm; math = & G3t_math; #ifndef _APP_RDN_ s_comp_totals = G3s_arithTotals; ip_arithBusy = &G3i_arithBusy; #endif } // L/M DPU2 else if (uc_appNum == 13) { ucp_packet = G13uc_tlm; math = &G13t_math; #ifndef _APP_RDN_ s_comp_totals = G3s_arithTotals; ip_arithBusy = &G3i_arithBusy; #endif } // L/M DPU1 else if (uc_appNum == 4) { ucp_packet = G4uc_tlm; math = & G4t_math; #ifndef _APP_RDN_ s_comp_totals = G5s_arithTotals; ip_arithBusy = &G5i_arithBusy; #endif } // L/M DPU2 else if (uc_appNum == 14) { ucp_packet = G14uc_tlm; math = &G14t_math; #ifndef _APP_RDN_ s_comp_totals = G5s_arithTotals; ip_arithBusy = &G5i_arithBusy; #endif } // H else if (uc_appNum == 5) { ucp_packet = G5uc_tlm; math = & G5t_math; #ifndef _APP_RDN_ s_comp_totals = G5s_arithTotals; ip_arithBusy = &G5i_arithBusy; #endif } else return(2); // APP Num error // **** CRUISE MODE: only HK(0), OneShot(1), L(2) if (Guc_OpeMode) { if (uc_drId>2) return(3); // CRUISE MODE } // **** LAST H-mode dump time if (uc_drId>4 && (uc_nodeIdGd_N_DPU2)) { Gui_TRG_TiLAST = t_timeInfo.ui_currentTime2 + 0x80; } // ******************** // FM-HEADER Location // ******************** if (uc_appNum == 2) i_FmHeaderLoc = 0; else i_FmHeaderLoc = d_fmHeaderLen + uc_sizeComment; // ************** // *** Check! *** // ************** if (i_FmHeaderLoc + i_sizeData >= 0x2000) return(4); // Packet Length error if (uc_nodeId>0x14) return(5); // NodeID error if (uc_drId>1 && uc_headId>0x12) return(6); // L/M/H error // ******************** // *** CCSDS Header *** // ******************** // --- HK(0) & OneShot(1) --- if (uc_drId<2) { if ( Gus_pacApidHk[uc_nodeId] == 0 ) return(7); // NodeID(APID) error if ( Guc_pacCatHk [uc_nodeId] == 0) return(8); // NodeID(CAT-ID) error t_ccsdsHdrInfo.us_APID = Gus_pacApidHk[uc_nodeId]; // *** APID(HK) if (uc_drId) t_ccsdsHdrInfo.uc_Category = Guc_pacCatOs [uc_nodeId]; // *** Category ID: OneShot else t_ccsdsHdrInfo.uc_Category = Guc_pacCatHk [uc_nodeId]; // *** Category ID: HK i_waitNrm = uc_drId; // WAIT: HK >0, OneShot >1 } // --- L(2) & M(3) --- else if (uc_drId<4) { if ( Gus_pacApid[uc_headId] == 0 ) return(9); // HeadID(APID) error t_ccsdsHdrInfo.us_APID = Gus_pacApid [uc_headId]; // *** APID(data) if (uc_drId==2) { if ( Guc_pacCatL [uc_headId] == 0) return(10); // HeadID(CAT-ID) error t_ccsdsHdrInfo.uc_Category = Guc_pacCatL [uc_headId]; // *** Category ID: L i_waitNrm = 2; } else { if ( Guc_pacCatM [uc_headId] == 0) return(11); // HeadID(CAT-ID) error t_ccsdsHdrInfo.uc_Category = Guc_pacCatM [uc_headId]; // *** Category ID: M i_waitNrm = 4; if (uc_headId == Gd_N_ENA || uc_headId == Gd_N_MSAS || uc_headId == Gd_N_AM2P ) i_waitNrm = 6; // *** Category ID: APP04 } } // --- H(4-9) --- else if (uc_drId<10) { if ( uc_headId>0x10 ) return(12); // HeadID error if ( Gus_pacApid[uc_headId] == 0) return(13); // HeadID(APID) error if ( Guc_pacCatH[uc_headId] == 0) return(14); // HeadID(CAT-ID) error t_ccsdsHdrInfo.us_APID = Gus_pacApid [uc_headId]; // *** APID(data) t_ccsdsHdrInfo.uc_Category = Guc_pacCatH [uc_headId] + (uc_drId-4)*10; // *** Category ID: H (Partition: 0-5) i_waitNrm = 6; } else return(15); // Dr-ID error // if (t_ccsdsHdrInfo.uc_Category>=0x80 || t_ccsdsHdrInfo.uc_Category< 0x20) return(16); // CAT-ID error // ******************************************************** // *** PACKET FORMATION *** // ******************************************************** app_WhoWhere( Guc_hkApp_ID[uc_appNum], uc_headId, 0xE1 ); // HK // -------------------- // --- ARITH1-COMP --- // -------------------- if (uc_cmp==2) { #ifdef _APP_RDN_ uc_cmp=1; #else for (;;) { if (*ip_arithBusy != 1) break; dpu_delay(10); } *ip_arithBusy = 1; i_flag = app_CompArith( uc_data, &(ucp_packet[i_FmHeaderLoc]), i_sizeData, s_comp_totals ); if (i_flag < i_sizeData && i_flag > 0) i_sizeData = i_flag; // *** Arith-Compressed *** else uc_cmp = *ip_arithBusy = 6; // *** 非圧縮 **** #endif } // -------------------- // --- ARITH0-COMP --- // -------------------- if (uc_cmp==1) { i_flag = app_CompMath( uc_data, &(ucp_packet[i_FmHeaderLoc]), i_sizeData, math ); if (i_flag < i_sizeData && i_flag > 0) i_sizeData = i_flag; // *** MATH-Compressed *** else uc_cmp = 0x5; // *** 非圧縮: ARITH0 **** } // ------------------ // --- RICE-COMP --- (added: 20120612) // ------------------ if (uc_cmp==4) { i_flag = Rice_Compress( uc_data, &(ucp_packet[i_FmHeaderLoc]), i_sizeData, RICE_FMT_UINT8); if (i_flag < i_sizeData && i_flag > 0) i_sizeData = i_flag; // *** RICE-Compressed *** else uc_cmp = 0x7; // *** 非圧縮: RICE **** } // ------------------ // --- Non-COMP --- // ------------------ if (uc_cmp==0 || uc_cmp==3 || uc_cmp>4) { memcpy( &(ucp_packet[i_FmHeaderLoc]), uc_data, i_sizeData); // *** 非圧縮 **** } // --------------- // --- COMMENT --- // --------------- if (uc_appNum != 2) { if (uc_sizeComment>0) memcpy( &(ucp_packet[d_fmHeaderLen]), uc_comment, uc_sizeComment); // COMMENT (Size: uc_sizeComment) } i_sizeData += i_FmHeaderLoc; // --- Packet ID: CMP & DR --- t_ccsdsHdrInfo.uc_PktId = (uc_cmp << 4) + (uc_drId & 0xF); // B1 b4-7 0:non 1(/2):ARITH0 4:RICE 3:After-User-COMP 5-7:non(fail) // b0-3 0-HK 1:One 2:L 3:M 4-9:H // ************************ // *** FM Packet Header *** // B0 NodeID(5bit)/DataID(3bit) // B1 b4-7 COMP-Mode 0:non 1:JPEG-rev 2:JPEG-nonrev 3:UserDef // b0-3 DATA-Mode 0-HK 1:Rep 2:L 3:M 4-9:H // B2-5 TI // B6: counter // B7: size - comment // B8-9: size - data // ************************ if (uc_appNum != 2) { // ***** Not HK ***** ucp_packet[0] = (uc_nodeId << 3) + (uc_dataId & 0x3); // B0 b3-7:NodeID(5bit) // b0-2:DataID(3bit) ucp_packet[1] = uc_pacId; // *** Packet ID (defined by Team) ***101226*** memcpy( &(ucp_packet[2]), &ui_time, 4); // B2-5 TI ucp_packet[6] = Guc_tlmCount[ t_ccsdsHdrInfo.uc_Category - 0x20]; // B6 counter (each Category) ucp_packet[7] = uc_sizeComment; // B7 size - comment memcpy( &(ucp_packet[8]), &us_sizeData, 2); // B8-9: data size } // BUSY-FLAG Gi_tlmBusyTask = (uc_headId & 0xFF) + ( (uc_drId & 0xF) << 8 ); // BUSY! (0x*00: DR-ID 0x0**:HeadID // ************************************************************************************************************ // *** !! WAIT !! *** // ************************************************************************************************************ app_WhoWhere( Guc_hkApp_ID[uc_appNum], uc_headId, 0xE6 ); // HK for (;;) { dpu_getDPUInfo (& t_dpuInfo ); if (t_dpuInfo.uc_tlmFreeCount > i_waitNrm) break; // TLM-buffer counter Max:29 dpu_delay(10); } app_WhoWhere( Guc_hkApp_ID[uc_appNum], uc_headId, 0xE7 ); // HK ucp_packet[i_sizeData] = 0x00; // *** PACKET size: +1 (130226) *** // ------------------------- // DATA PUT // ------------------------- for (;;) { // ********************************************************* // ***** Non-COMP & Math-Comp & Pre-COMP Data ************** // ********************************************************* i_tlmBusy = 0; i_flag = dpu_putTelemetry( &t_ccsdsHdrInfo, i_sizeData+1, ucp_packet, &i_tlmBusy ); // *** PACKET size: +1 (130207) *** if ( i_flag == -2 ) { dpu_waitProcessingSlot(1); continue; // dpu_putTlm error (MW buffer full): send again! } if ( i_flag ) { #ifndef _APP_RDN_ *ip_arithBusy = 0; #endif return(0xFE); // *** ERR: dpu_putTlm error (unknown) } for (;;) { if (i_tlmBusy != 1) break; dpu_delay(10); } if ( i_tlmBusy < 0 ) { #ifndef _APP_RDN_ *ip_arithBusy = 0; #endif return(0xFF); // *** ERR: ERROR? } // Counter Guc_tlmCount[ t_ccsdsHdrInfo.uc_Category - 0x20 ] ++; // Count per Category Gui_tlmTI [ t_ccsdsHdrInfo.uc_Category - 0x20 ] = ui_time; // TI break; } app_WhoWhere( Guc_hkApp_ID[uc_appNum], uc_headId, 0xE8 ); // HK #ifndef _APP_RDN_ *ip_arithBusy = 0; #endif return(0); } // ******************************************* // ************* MEM load/read *************** // ******************************************* // =========================================================================== // int app_readROM **** E2PROM読み出し **** // [INPUT] unsigned int ui_romAddress, ROM address // unsigned int ui_sizeData data size // unsigned char uc_romData[] ROM data // [return] int 0:nrm それ以外:error // =========================================================================== int app_readROM( unsigned int ui_romAddress, // [INPUT] ROM address unsigned int ui_sizeData, // [INPUT] data size unsigned char uc_romData[] ) // [OUTPUT] ROM data { int i_flag; // if ( ui_romAddress + ui_sizeData > 0x1FD00000) return(1); // Oversize // if ( ui_romAddress < 0x1FC00000) return(2); // Less size // if ( ui_romAddress < Gd_EWO_RomAdr) return(3); // Less size i_flag = dpu_readEEPROM( ui_romAddress, ui_sizeData, uc_romData ); return(i_flag); } // =========================================================================== // int app_PiMemLoad **** PI機器へ任意アドレスMemory Load **** // [INPUT] unsigned char uc_nodeId 対象Node-ID // unsigned int ui_memAddress, Load address // unsigned char uc_memData[163], Load data (163B max) [冗長時:163B-max] // int i_sizeData) Load data size // [return] int 0:nrm それ以外:error // =========================================================================== int app_PiMemLoad( unsigned char uc_nodeId, // [INPUT] Node-ID unsigned int ui_memAddress, // [INPUT] Load address unsigned char uc_memData[163], // [INPUT] Load data (163B max) int i_sizeData) // [INPUT] Load data size { int i_flag; if (i_sizeData > 163) return(1); // **** non-redundancy **** #ifdef _APP_RDN_ if ( app_Rdn_nodeId( uc_nodeId ) == 0) { #endif // _APP_RDN_ i_flag = dpu_missionMemLoad( uc_nodeId, ui_memAddress, uc_memData, i_sizeData ); #ifdef _APP_RDN_ } else { if ( (Guc_RDN_MemLoad_NID & 0x80) == 0 && i_sizeData <= 163) { Guc_RDN_MemLoad_NID = uc_nodeId + 0x80; // internal write Gui_RDN_MemLoad_Address = ui_memAddress; Guc_RDN_MemLoad_Size = i_sizeData; memcpy( Guc_RDN_MemLoad_Data, uc_memData, Guc_RDN_MemLoad_Size); i_flag = 0; } else { i_flag = 4; } } #endif // _APP_RDN_ return(i_flag); } // **************************************** // ************* Who & Where ************** // **************************************** // =========================================================================== // app_WhoWhere **** 特定Node-IDのHK読出し **** // [INPUT] unsigned char uc_appNum Application番号 // unsigned char uc_who Who? [Head-ID] // unsigned char uc_where Where [Any] // =========================================================================== void app_WhoWhere( unsigned char uc_appNum, // [INPUT] Application番号 unsigned char uc_who, // Who? [Head-ID] unsigned char uc_where ) // Where [Any] { if (uc_appNum > 6) return; Guc_hkApp_who [uc_appNum] = uc_who; Guc_hkApp_where[uc_appNum] = uc_where; dpu_setWDT( 800 ); // 125msec x 800 = 100sec }