CFE_TIME_SysTime_t Ut_CFE_SB_GetMsgTimeHook(CFE_SB_MsgPtr_t MsgPtr) { #ifdef MESSAGE_FORMAT_IS_CCSDS CFE_TIME_SysTime_t TimeFromMsg; CFE_SB_TlmHdr_t *TlmHdrPtr; /* if msg type is a command or msg has no secondary hdr, return 0 */ if((CCSDS_RD_TYPE(MsgPtr->Hdr) == CCSDS_CMD)||(CCSDS_RD_SHDR(MsgPtr->Hdr) == 0)){ TimeFromMsg.Seconds = 0; TimeFromMsg.Subseconds = 0; }else{ TlmHdrPtr = (CFE_SB_TlmHdr_t *)MsgPtr; TimeFromMsg.Seconds = *((uint32 *)&TlmHdrPtr->Sec.Time[0]); /* Get the 16 bit subsecond field from the header and place it in the */ /* upper 16 bits of the 32 bit subsecond field of the CFE_TIME_SysTime_t */ TimeFromMsg.Subseconds = *((uint16 *)&TlmHdrPtr->Sec.Time[4]) << 16; }/* end if */ return TimeFromMsg; #endif }/* end Ut_CFE_SB_GetMsgTimeHook */
uint16 Ut_CFE_SB_MsgHdrSizeHook(CFE_SB_MsgId_t MsgId) { #ifdef MESSAGE_FORMAT_IS_CCSDS uint16 size; CCSDS_PriHdr_t CCSDSPriHdr; CCSDS_WR_SID(CCSDSPriHdr,MsgId); /* if secondary hdr is not present... */ if(CCSDS_RD_SHDR(CCSDSPriHdr) == 0){ size = sizeof(CCSDS_PriHdr_t); }else if(CCSDS_RD_TYPE(CCSDSPriHdr) == CCSDS_CMD){ size = CFE_SB_CMD_HDR_SIZE; }else{ size = CFE_SB_TLM_HDR_SIZE; } return size; #endif }/* end Ut_CFE_SB_MsgHdrSizeHook */
boolean Ut_CFE_SB_ValidateChecksumHook(CFE_SB_MsgPtr_t MsgPtr) { #ifdef MESSAGE_FORMAT_IS_CCSDS CCSDS_CmdPkt_t *CmdPktPtr; /* if msg type is telemetry or there is no secondary hdr... */ if((CCSDS_RD_TYPE(MsgPtr->Hdr) == CCSDS_TLM)||(CCSDS_RD_SHDR(MsgPtr->Hdr) == 0)){ return FALSE; }/* end if */ CmdPktPtr = (CCSDS_CmdPkt_t *)MsgPtr; return CCSDS_ValidCheckSum (CmdPktPtr); #endif }/* end Ut_CFE_SB_ValidateChecksumHook */
uint16 Ut_CFE_SB_GetChecksumHook(CFE_SB_MsgPtr_t MsgPtr) { #ifdef MESSAGE_FORMAT_IS_CCSDS CFE_SB_CmdHdr_t *CmdHdrPtr; /* if msg type is telemetry or there is no secondary hdr... */ if((CCSDS_RD_TYPE(MsgPtr->Hdr) == CCSDS_TLM)||(CCSDS_RD_SHDR(MsgPtr->Hdr) == 0)){ return 0; }/* end if */ /* cast the input pointer to a Cmd Msg pointer */ CmdHdrPtr = (CFE_SB_CmdHdr_t *)MsgPtr; return CCSDS_RD_CHECKSUM(CmdHdrPtr->Sec); #endif }/* end Ut_CFE_SB_GetChecksumHook */
/****************************************************************************** ** Function: CFE_SB_GetMsgTime() ** ** Purpose: ** Get the time field from a message. ** ** Arguments: ** MsgPtr - Pointer to a CFE_SB_Msg_t ** ** Return: ** Time field from message or ** Time value of zero for msgs that do not have a Time field in header */ CFE_TIME_SysTime_t CFE_SB_GetMsgTime(CFE_SB_MsgPtr_t MsgPtr) { CFE_TIME_SysTime_t TimeFromMsg; uint32 LocalSecs32 = 0; uint32 LocalSubs32 = 0; #ifdef MESSAGE_FORMAT_IS_CCSDS #if (CFE_SB_PACKET_TIME_FORMAT == CFE_SB_TIME_32_16_SUBS) uint16 LocalSubs16; #endif CFE_SB_TlmHdr_t *TlmHdrPtr; /* if msg type is a command or msg has no secondary hdr, time = 0 */ if ((CCSDS_RD_TYPE(MsgPtr->Hdr) != CCSDS_CMD) && (CCSDS_RD_SHDR(MsgPtr->Hdr) != 0)) { /* copy time data to/from packets to eliminate alignment issues */ TlmHdrPtr = (CFE_SB_TlmHdr_t *)MsgPtr; #if (CFE_SB_PACKET_TIME_FORMAT == CFE_SB_TIME_32_16_SUBS) CFE_PSP_MemCpy(&LocalSecs32, &TlmHdrPtr->Sec.Time[0], 4); CFE_PSP_MemCpy(&LocalSubs16, &TlmHdrPtr->Sec.Time[4], 2); /* convert packet data into CFE_TIME_SysTime_t format */ LocalSubs32 = ((uint32) LocalSubs16) << 16; #elif (CFE_SB_PACKET_TIME_FORMAT == CFE_SB_TIME_32_32_SUBS) CFE_PSP_MemCpy(&LocalSecs32, &TlmHdrPtr->Sec.Time[0], 4); CFE_PSP_MemCpy(&LocalSubs32, &TlmHdrPtr->Sec.Time[4], 4); /* no conversion necessary -- packet format = CFE_TIME_SysTime_t format */ #elif (CFE_SB_PACKET_TIME_FORMAT == CFE_SB_TIME_32_32_M_20) CFE_PSP_MemCpy(&LocalSecs32, &TlmHdrPtr->Sec.Time[0], 4); CFE_PSP_MemCpy(&LocalSubs32, &TlmHdrPtr->Sec.Time[4], 4); /* convert packet data into CFE_TIME_SysTime_t format */ LocalSubs32 = CFE_TIME_Micro2SubSecs((LocalSubs32 >> 12)); #endif }
int32 Ut_CFE_SB_SetMsgTimeHook(CFE_SB_MsgPtr_t MsgPtr, CFE_TIME_SysTime_t Time) { #ifdef MESSAGE_FORMAT_IS_CCSDS CFE_SB_TlmHdr_t *TlmHdrPtr; /* if msg type is a command or secondary header is not present... */ if((CCSDS_RD_TYPE(MsgPtr->Hdr) == CCSDS_CMD)||(CCSDS_RD_SHDR(MsgPtr->Hdr) == 0)){ return CFE_SB_WRONG_MSG_TYPE; }/* end if */ TlmHdrPtr = (CFE_SB_TlmHdr_t *)MsgPtr; *((uint32 *)&TlmHdrPtr->Sec.Time[0]) = Time.Seconds; *((uint16 *)&TlmHdrPtr->Sec.Time[4]) = Time.Subseconds >> 16; return CFE_SUCCESS; #endif }/* end Ut_CFE_SB_SetMsgTimeHook */
int32 Ut_CFE_SB_SetCmdCodeHook(CFE_SB_MsgPtr_t MsgPtr, uint16 CmdCode) { #ifdef MESSAGE_FORMAT_IS_CCSDS CFE_SB_CmdHdr_t *CmdHdrPtr; /* if msg type is telemetry or there is no secondary hdr... */ if((CCSDS_RD_TYPE(MsgPtr->Hdr) == CCSDS_TLM)||(CCSDS_RD_SHDR(MsgPtr->Hdr) == 0)){ return CFE_SB_WRONG_MSG_TYPE; }/* end if */ /* Cast the input pointer to a Cmd Msg pointer */ CmdHdrPtr = (CFE_SB_CmdHdr_t *)MsgPtr; CCSDS_WR_FC(CmdHdrPtr->Sec,CmdCode); return CFE_SUCCESS; #endif }/* end Ut_CFE_SB_SetCmdCodeHook */