Skip to content

Commit

Permalink
Fix nasa#297, CCSDS sec cmd hdr consistancy
Browse files Browse the repository at this point in the history
Implement CCSDS command secondary header such that it
is endian agnostic in code and unit test support.
  • Loading branch information
skliper committed Mar 25, 2020
1 parent 5408523 commit 2d48787
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 22 deletions.
22 changes: 12 additions & 10 deletions fsw/cfe-core/src/inc/ccsds.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,11 +107,12 @@ typedef struct {

typedef struct {

uint16 Command; /* command secondary header */
/* bits shift ------------ description ---------------- */
/* 0x00FF 0 : checksum, calculated by ground system */
/* 0x7F00 8 : command function code */
/* 0x8000 15 : reserved, set to 0 */
uint8 FunctionCode; /* Command Function Code */
/* bits shift ---------description-------- */
/* 0x7F 0 Command function code */
/* 0x80 7 Reserved */

uint8 Checksum; /* Command checksum (all bits, 0xFF) */

} CCSDS_CmdSecHdr_t;

Expand Down Expand Up @@ -326,14 +327,14 @@ typedef CCSDS_TelemetryPacket_t CCSDS_TlmPkt_t;
(((phdr).Length[1] = ((value) - 7) & 0xff)) )

/* Read function code from command secondary header. */
#define CCSDS_RD_FC(shdr) CCSDS_RD_BITS((shdr).Command, 0x7F00, 8)
#define CCSDS_RD_FC(shdr) CCSDS_RD_BITS((shdr).FunctionCode, 0x7F, 0)
/* Write function code to command secondary header. */
#define CCSDS_WR_FC(shdr,value) CCSDS_WR_BITS((shdr).Command, 0x7F00, 8, value)
#define CCSDS_WR_FC(shdr,value) CCSDS_WR_BITS((shdr).FunctionCode, 0x7F, 0, value)

/* Read checksum from command secondary header. */
#define CCSDS_RD_CHECKSUM(shdr) CCSDS_RD_BITS((shdr).Command, 0x00FF, 0)
#define CCSDS_RD_CHECKSUM(shdr) ((shdr).Checksum)
/* Write checksum to command secondary header. */
#define CCSDS_WR_CHECKSUM(shdr,val) CCSDS_WR_BITS((shdr).Command, 0x00FF, 0, val)
#define CCSDS_WR_CHECKSUM(shdr,val) ((shdr).Checksum = (val))

/* Define additional APID Qualifier macros. */

Expand Down Expand Up @@ -378,7 +379,8 @@ typedef CCSDS_TelemetryPacket_t CCSDS_TlmPkt_t;

/* Clear command secondary header. */
#define CCSDS_CLR_CMDSEC_HDR(shdr) \
( (shdr).Command = (CCSDS_INIT_CHECKSUM << 0) | (CCSDS_INIT_FC << 8) )
( (shdr).FunctionCode = CCSDS_INIT_FC,\
(shdr).Checksum = CCSDS_INIT_CHECKSUM )


#define CCSDS_WR_SEC_HDR_SEC(shdr, value) shdr.Time[0] = ((value>>24) & 0xFF), \
Expand Down
22 changes: 10 additions & 12 deletions fsw/cfe-core/unit-test/ut_support.c
Original file line number Diff line number Diff line change
Expand Up @@ -481,30 +481,28 @@ int16 UT_GetActualPktLenField(CFE_SB_MsgPtr_t MsgPtr)
uint8 UT_GetActualCmdCodeField(CFE_SB_MsgPtr_t MsgPtr)
{
/*
* CFE 6.4.0 tried to make all headers big-endian.
* CFE 6.4.1 made secondary headers native-endian again.
*
* This function is used to "go around" the structure field
* definitions and access macro definitions, to look for the
* bits of the function code in the exact spot where we are
* expecting to find them.
*
* The CCSDS Command Function Code is defined as living in
* bits 8 through 14 (mask 0x7F00) of the 16-bit unsigned
* value encoded in NATIVE endianness in the two bytes
* stored at offsets 6 and 7 in the packet for CCSDS version 1
* and offsets 10 and 11 for CCSDS Version 2
* the first byte of the command secondary header (mask 0x7F)
* NOTE: this definition is endian agnostic
*
* CCSDS version 1 - cmd sec header is offset 6 bytes
* CCSDS Version 2 - cmd sec header is offset 10 bytes
*/

uint8 CmdCodeWordFieldIndex; /* Field index (in WORDS) */
uint16 *w = (uint16 *)MsgPtr;
uint8 Index; /* Field index (in BYTES) */
uint8 *w = (uint8 *)MsgPtr;

#ifndef MESSAGE_FORMAT_IS_CCSDS_VER_2
CmdCodeWordFieldIndex = 3;
Index = 6;
#else
CmdCodeWordFieldIndex = 5;
Index = 10;
#endif
return (w[CmdCodeWordFieldIndex] & 0x7F00) >> 8;
return (w[Index] & 0x7F);
}


Expand Down

0 comments on commit 2d48787

Please sign in to comment.