diff --git a/config/default_cf_extern_typedefs.h b/config/default_cf_extern_typedefs.h index ed441941..66100420 100644 --- a/config/default_cf_extern_typedefs.h +++ b/config/default_cf_extern_typedefs.h @@ -38,11 +38,19 @@ * * Defined per section 7.1 of CCSDS 727.0-B-5 */ -typedef enum +enum CF_CFDP_Class { - CF_CFDP_CLASS_1 = 0, /**< \brief CFDP class 1 - Unreliable transfer */ - CF_CFDP_CLASS_2 = 1, /**< \brief CFDP class 2 - Reliable transfer */ -} CF_CFDP_Class_t; + CF_CFDP_Class_1 = 0, /**< \brief CFDP class 1 - Unreliable transfer */ + CF_CFDP_Class_2 = 1, /**< \brief CFDP class 2 - Reliable transfer */ +}; + +/** + * @brief External type to use for CFDP class + * + * This uses the labels defined in enum CF_CFDP_Class + * but maps to a fixed-width type for use in CMD/TLM/Tables + */ +typedef uint8 CF_CFDP_Class_Enum_t; /** * @brief CF queue identifiers diff --git a/config/default_cf_msgdefs.h b/config/default_cf_msgdefs.h index 285aedf2..fcd5be2c 100644 --- a/config/default_cf_msgdefs.h +++ b/config/default_cf_msgdefs.h @@ -28,6 +28,66 @@ #include "common_types.h" #include "cf_extern_typedefs.h" +/** + * \defgroup cfscfmsgtypes Typedefs used in CFS CFDP Commands and Telemetry + * \{ + */ + +/** + * \brief Type IDs for use for Write Queue cmd + */ +typedef enum CF_Type +{ + CF_Type_all = 0, /**< \brief Type all */ + CF_Type_up = 1, /**< \brief Type up */ + CF_Type_down = 2 /**< \brief Type down */ +} CF_Type_t; + +/** + * @brief External type to use for CFDP queue type + * + * This uses the labels defined in enum CF_Type + * but maps to a fixed-width type for use in CMD/TLM/Tables + */ +typedef uint8 CF_Type_Enum_t; + +/** + * @brief Standardized type used for channel selection in commands + * + * 255 = all channels (if applicable; not all commands allow all channels) + * 0-X = single channel number + */ +typedef uint8 CF_ChannelSelect_t; + +/** + * Standardized type used for polling directory selection in commands + * + * 255 = all polling directory indices (if applicable) + * 0-X = single polling directory index number + */ +typedef uint8 CF_PollIdxSelect_t; + +/** + * \brief Enum labels for use for queue selection + */ +enum CF_QueueSelect +{ + CF_QueueSelect_Pending = 0, /**< \brief Pending Queue */ + CF_QueueSelect_Active = 1, /**< \brief Active Queue */ + CF_QueueSelect_History = 2, /**< \brief History Queue */ + CF_QueueSelect_All = 3, /**< \brief All queues */ +}; + +/** + * @brief External type to use for CFDP queue select + * + * This uses the labels defined in enum CF_QueueSelect + * but maps to a fixed-width type for use in CMD/TLM/Tables + */ +typedef uint8 CF_QueueSelect_Enum_t; + +/** \} */ + /** * \defgroup cfscftlm CFS CFDP Telemetry * \{ @@ -146,47 +206,86 @@ typedef struct CF_EotPacket_Payload */ /** - * \brief Command payload argument union to support 4 uint8's, 2 uint16's or 1 uint32 + * \brief Enum labels for use for Reset cmd */ -typedef union CF_UnionArgs_Payload -{ - uint32 dword; /**< \brief Generic uint32 argument */ - uint16 hword[2]; /**< \brief Generic uint16 array of arguments */ - uint8 byte[4]; /**< \brief Generic uint8 array of arguments */ -} CF_UnionArgs_Payload_t; - -/** - * \brief IDs for use for Reset cmd - */ -typedef enum +enum CF_Reset { CF_Reset_all = 0, /**< \brief Reset all */ CF_Reset_command = 1, /**< \brief Reset command */ CF_Reset_fault = 2, /**< \brief Reset fault */ CF_Reset_up = 3, /**< \brief Reset up */ CF_Reset_down = 4 /**< \brief Reset down */ -} CF_Reset_t; +}; /** - * \brief Type IDs for use for Write Queue cmd + * @brief External type to use for Reset command + * + * This uses the labels defined in enum CF_Reset + * but maps to a fixed-width type for use in CMD/TLM/Tables + */ +typedef uint8 CF_Reset_Enum_t; + +/** + * \brief Reset command payload + * + * For command details see #CF_RESET_CC */ -typedef enum +typedef struct CF_ResetCountersCmd_Payload { - CF_Type_all = 0, /**< \brief Type all */ - CF_Type_up = 1, /**< \brief Type up */ - CF_Type_down = 2 /**< \brief Type down */ -} CF_Type_t; + CF_Reset_Enum_t ResetType; +} CF_ResetCountersCmd_Payload_t; + +/** + * \brief Single byte channel selector payload + * + * Used in all commands needing only a channel selection + * - 255 = all channels + * - else = single channel + */ +typedef struct CF_ChannelSelect_Payload +{ + CF_ChannelSelect_t ChannelSelect; +} CF_ChannelSelect_Payload_t; + +/** + * \brief Polling directory selector payload + * + * Used in all commands needing a polldir selection + * + * Single byte channel selector + * - 255 = all channels + * - else = single channel + * + * Single byte polling directory index + * - 255 = all polling directories + * - else = single polling directory index + */ +typedef struct CF_PollDirSelect_Payload +{ + CF_ChannelSelect_t ChannelSelect; + CF_PollIdxSelect_t PollDirIndx; +} CF_PollDirSelect_Payload_t; /** - * \brief Queue IDs for use for Write Queue cmd + * \brief Queue selector payload + * + * Used in all commands needing a queue selection + * + * Single byte channel selector + * - 255 = all channels + * - else = single channel + * + * Single byte queue selection enum + * Values indicated by #CF_QueueSelect enum + * - 0 = Pending queue + * - 1 = History queue + * - 2 = Both pending and history queue */ -typedef enum +typedef struct CF_QueueSelect_Payload { - CF_Queue_pend = 0, /**< \brief Queue pending */ - CF_Queue_active = 1, /**< \brief Queue active */ - CF_Queue_history = 2, /**< \brief Queue history */ - CF_Queue_all = 3 /**< \brief Queue all */ -} CF_Queue_t; + CF_ChannelSelect_t ChannelSelect; + CF_QueueSelect_Enum_t QueueSelect; +} CF_QueueSelect_Payload_t; /** * \brief Parameter IDs for use with Get/Set parameter messages @@ -194,7 +293,7 @@ typedef enum * Specifically these are used for the "key" field within CF_GetParamCmd_t and * CF_SetParamCmd_t message structures. */ -typedef enum +enum CF_GetSet_ValueID { CF_GetSet_ValueID_ticks_per_second, /**< \brief Ticks per second key */ CF_GetSet_ValueID_rx_crc_calc_bytes_per_wakeup, /**< \brief Receive CRC calculated bytes per wake-up key */ @@ -207,7 +306,15 @@ typedef enum CF_GetSet_ValueID_local_eid, /**< \brief Local entity id key */ CF_GetSet_ValueID_chan_max_outgoing_messages_per_wakeup, /**< \brief Max outgoing messages per wake-up key */ CF_GetSet_ValueID_MAX /**< \brief Key limit used for validity check */ -} CF_GetSet_ValueID_t; +}; + +/** + * @brief External type to use for CF_GetSet_ValueID + * + * This uses the labels defined in enum CF_GetSet_ValueID + * but maps to a fixed-width type for use in CMD/TLM/Tables + */ +typedef uint8 CF_GetSet_ValueID_Enum_t; /** * \brief Get parameter command structure @@ -216,8 +323,8 @@ typedef enum */ typedef struct CF_GetParam_Payload { - uint8 key; /**< \brief Parameter key, see #CF_GetSet_ValueID_t */ - uint8 chan_num; /**< \brief Channel number */ + CF_GetSet_ValueID_Enum_t key; /**< \brief Parameter key, see #CF_GetSet_ValueID_t */ + CF_ChannelSelect_t chan_num; /**< \brief Channel number */ } CF_GetParam_Payload_t; /** @@ -227,10 +334,10 @@ typedef struct CF_GetParam_Payload */ typedef struct CF_SetParam_Payload { - uint32 value; /**< \brief Parameter value to set */ - uint8 key; /**< \brief Parameter key, see #CF_GetSet_ValueID_t */ - uint8 chan_num; /**< \brief Channel number */ - uint8 spare[2]; /**< \brief Alignment spare, uint32 multiple */ + uint32 value; /**< \brief Parameter value to set */ + CF_GetSet_ValueID_Enum_t key; /**< \brief Parameter key, see #CF_GetSet_ValueID_t */ + CF_ChannelSelect_t chan_num; /**< \brief Channel number */ + uint8 spare[2]; /**< \brief Alignment spare, uint32 multiple */ } CF_SetParam_Payload_t; /** @@ -240,13 +347,13 @@ typedef struct CF_SetParam_Payload */ typedef struct CF_TxFile_Payload { - uint8 cfdp_class; /**< \brief CFDP class: 0=class 1, 1=class 2 */ - uint8 keep; /**< \brief Keep file flag: 1=keep, else delete */ - uint8 chan_num; /**< \brief Channel number */ - uint8 priority; /**< \brief Priority: 0=highest priority */ - CF_EntityId_t dest_id; /**< \brief Destination entity id */ - char src_filename[CF_FILENAME_MAX_LEN]; /**< \brief Source file/directory name */ - char dst_filename[CF_FILENAME_MAX_LEN]; /**< \brief Destination file/directory name */ + CF_CFDP_Class_Enum_t cfdp_class; /**< \brief CFDP class: 0=class 1, 1=class 2 */ + uint8 keep; /**< \brief Keep file flag: 1=keep, else delete */ + CF_ChannelSelect_t chan_num; /**< \brief Channel number */ + uint8 priority; /**< \brief Priority: 0=highest priority */ + CF_EntityId_t dest_id; /**< \brief Destination entity id */ + char src_filename[CF_FILENAME_MAX_LEN]; /**< \brief Source file/directory name */ + char dst_filename[CF_FILENAME_MAX_LEN]; /**< \brief Destination file/directory name */ } CF_TxFile_Payload_t; /** @@ -256,10 +363,10 @@ typedef struct CF_TxFile_Payload */ typedef struct CF_WriteQueue_Payload { - uint8 type; /**< \brief Transaction direction: all=0, up=1, down=2 */ - uint8 chan; /**< \brief Channel number */ - uint8 queue; /**< \brief Queue type: 0=pending, 1=active, 2=history, 3=all */ - uint8 spare; /**< \brief Alignment spare, puts filename on 32-bit boundary */ + CF_Type_Enum_t type; /**< \brief Transaction direction: all=0, up=1, down=2 */ + CF_ChannelSelect_t chan; /**< \brief Channel number */ + CF_QueueSelect_Enum_t queue; /**< \brief Queue type: 0=pending, 1=active, 2=history, 3=all */ + uint8 spare; /**< \brief Alignment spare, puts filename on 32-bit boundary */ char filename[CF_FILENAME_MAX_LEN]; /**< \brief Filename written to */ } CF_WriteQueue_Payload_t; @@ -273,10 +380,32 @@ typedef struct CF_Transaction_Payload { CF_TransactionSeq_t ts; /**< \brief Transaction sequence number */ CF_EntityId_t eid; /**< \brief Entity id */ - uint8 chan; /**< \brief Channel number: 254=use ts, 255=all channels, else channel */ + CF_ChannelSelect_t chan_num; /**< \brief Channel number: 254=use ts, 255=all channels, else channel */ uint8 spare[3]; /**< \brief Alignment spare for 32-bit multiple */ } CF_Transaction_Payload_t; /**\}*/ +/** + * @brief Internal type (enum) for the CFDP class. + * + * This typedef should only be used internally but the same labels/values + * apply externally as well. Notably this is a native-width type, and for + * external cmd/tlm use it needs to be a fixed-width type. + * + * @sa #CF_CFDP_Class_Enum_t + */ +typedef enum CF_CFDP_Class CF_CFDP_Class_t; + +/** + * @brief Internal type (enum) for the CFDP value identifier. + * + * This typedef should only be used internally but the same labels/values + * apply externally as well. Notably this is a native-width type, and for + * external cmd/tlm use it needs to be a fixed-width type. + * + * @sa #CF_GetSet_ValueID_Enum_t + */ +typedef enum CF_GetSet_ValueID CF_GetSet_ValueID_t; + #endif diff --git a/config/default_cf_msgstruct.h b/config/default_cf_msgstruct.h index 29eec046..dd60de22 100644 --- a/config/default_cf_msgstruct.h +++ b/config/default_cf_msgstruct.h @@ -103,8 +103,8 @@ typedef struct CF_DisableEngineCmd */ typedef struct CF_ResetCountersCmd { - CFE_MSG_CommandHeader_t CommandHeader; /**< \brief Command header */ - CF_UnionArgs_Payload_t Payload; /**< \brief Generic command arguments */ + CFE_MSG_CommandHeader_t CommandHeader; /**< \brief Command header */ + CF_ResetCountersCmd_Payload_t Payload; /**< \brief Command arguments */ } CF_ResetCountersCmd_t; /** @@ -114,8 +114,8 @@ typedef struct CF_ResetCountersCmd */ typedef struct CF_FreezeCmd { - CFE_MSG_CommandHeader_t CommandHeader; /**< \brief Command header */ - CF_UnionArgs_Payload_t Payload; /**< \brief Generic command arguments */ + CFE_MSG_CommandHeader_t CommandHeader; /**< \brief Command header */ + CF_ChannelSelect_Payload_t Payload; /**< \brief Command arguments */ } CF_FreezeCmd_t; /** @@ -125,8 +125,8 @@ typedef struct CF_FreezeCmd */ typedef struct CF_ThawCmd { - CFE_MSG_CommandHeader_t CommandHeader; /**< \brief Command header */ - CF_UnionArgs_Payload_t Payload; /**< \brief Generic command arguments */ + CFE_MSG_CommandHeader_t CommandHeader; /**< \brief Command header */ + CF_ChannelSelect_Payload_t Payload; /**< \brief Command arguments */ } CF_ThawCmd_t; /** @@ -136,8 +136,8 @@ typedef struct CF_ThawCmd */ typedef struct CF_EnableDequeueCmd { - CFE_MSG_CommandHeader_t CommandHeader; /**< \brief Command header */ - CF_UnionArgs_Payload_t Payload; /**< \brief Generic command arguments */ + CFE_MSG_CommandHeader_t CommandHeader; /**< \brief Command header */ + CF_ChannelSelect_Payload_t Payload; /**< \brief Command arguments */ } CF_EnableDequeueCmd_t; /** @@ -147,8 +147,8 @@ typedef struct CF_EnableDequeueCmd */ typedef struct CF_DisableDequeueCmd { - CFE_MSG_CommandHeader_t CommandHeader; /**< \brief Command header */ - CF_UnionArgs_Payload_t Payload; /**< \brief Generic command arguments */ + CFE_MSG_CommandHeader_t CommandHeader; /**< \brief Command header */ + CF_ChannelSelect_Payload_t Payload; /**< \brief Command arguments */ } CF_DisableDequeueCmd_t; /** @@ -158,8 +158,8 @@ typedef struct CF_DisableDequeueCmd */ typedef struct CF_EnableDirPollingCmd { - CFE_MSG_CommandHeader_t CommandHeader; /**< \brief Command header */ - CF_UnionArgs_Payload_t Payload; /**< \brief Generic command arguments */ + CFE_MSG_CommandHeader_t CommandHeader; /**< \brief Command header */ + CF_PollDirSelect_Payload_t Payload; /**< \brief Command arguments */ } CF_EnableDirPollingCmd_t; /** @@ -169,8 +169,8 @@ typedef struct CF_EnableDirPollingCmd */ typedef struct CF_DisableDirPollingCmd { - CFE_MSG_CommandHeader_t CommandHeader; /**< \brief Command header */ - CF_UnionArgs_Payload_t Payload; /**< \brief Generic command arguments */ + CFE_MSG_CommandHeader_t CommandHeader; /**< \brief Command header */ + CF_PollDirSelect_Payload_t Payload; /**< \brief Command arguments */ } CF_DisableDirPollingCmd_t; /** @@ -180,8 +180,8 @@ typedef struct CF_DisableDirPollingCmd */ typedef struct CF_PurgeQueueCmd { - CFE_MSG_CommandHeader_t CommandHeader; /**< \brief Command header */ - CF_UnionArgs_Payload_t Payload; /**< \brief Generic command arguments */ + CFE_MSG_CommandHeader_t CommandHeader; /**< \brief Command header */ + CF_QueueSelect_Payload_t Payload; /**< \brief Command arguments */ } CF_PurgeQueueCmd_t; /** diff --git a/config/default_cf_tbldefs.h b/config/default_cf_tbldefs.h index 03da6e33..73f0801d 100644 --- a/config/default_cf_tbldefs.h +++ b/config/default_cf_tbldefs.h @@ -41,9 +41,9 @@ typedef struct CF_PollDir { uint32 interval_sec; /**< \brief number of seconds to wait before trying a new directory */ - uint8 priority; /**< \brief priority to use when placing transactions on the pending queue */ - CF_CFDP_Class_t cfdp_class; /**< \brief the CFDP class to send */ - CF_EntityId_t dest_eid; /**< \brief destination entity id */ + uint8 priority; /**< \brief priority to use when placing transactions on the pending queue */ + CF_CFDP_Class_Enum_t cfdp_class; /**< \brief the CFDP class to send */ + CF_EntityId_t dest_eid; /**< \brief destination entity id */ char src_dir[CF_FILENAME_MAX_PATH]; /**< \brief path to source dir */ char dst_dir[CF_FILENAME_MAX_PATH]; /**< \brief path to destination dir */ @@ -83,7 +83,15 @@ typedef struct CF_ChannelConfig * For backward compatibility with existing CF table definitions, include the other part here. */ #ifndef CF_OMIT_DEPRECATED + #include "cf_tblstruct.h" + +/* + * Preserve compatibility with table definitions that specify the class using these terms + */ +#define CF_CFDP_CLASS_1 CF_CFDP_Class_1 +#define CF_CFDP_CLASS_2 CF_CFDP_Class_2 + #endif #endif diff --git a/config/eds_cf_extern_typedefs.h b/config/eds_cf_extern_typedefs.h index f1d514d2..374bb160 100644 --- a/config/eds_cf_extern_typedefs.h +++ b/config/eds_cf_extern_typedefs.h @@ -33,18 +33,21 @@ #include "cf_eds_typedefs.h" /* Define type mappings for CF-specific types */ -typedef CF_QueueIdx_Enum_t CF_QueueIdx_t; #define CF_QueueIdx_NUM (1 + EdsDataType_EdsEnum_CF_QueueIdx_t_MAX) #define CF_GetSet_ValueID_MAX (1 + EdsDataType_EdsEnum_CF_GetSet_ValueID_t_MAX) -typedef CF_EntityId_Atom_t CF_EntityId_t; -typedef CF_TransactionSeq_Atom_t CF_TransactionSeq_t; +typedef EdsDataType_CF_EntityId_t CF_EntityId_t; +typedef EdsDataType_CF_TransactionSeq_t CF_TransactionSeq_t; -typedef CF_CFDP_Enum_t CF_CFDP_Class_t; -typedef CF_GetSet_ValueID_Enum_t CF_GetSet_ValueID_t; +typedef enum EdsEnum_CF_QueueIdx CF_QueueIdx_t; +typedef enum EdsEnum_CF_CFDP_Class CF_CFDP_Class_t; +typedef enum EdsEnum_CF_GetSet_ValueID CF_GetSet_ValueID_t; + +typedef EdsDataType_CF_PollIdxSelect_t CF_PollIdxSelect_t; +typedef EdsDataType_CF_ChannelSelect_t CF_ChannelSelect_t; typedef EdsDataType_BASE_TYPES_PathName_t CF_PathName_t; typedef EdsDataType_BASE_TYPES_FileName_t CF_FileName_t; -#endif \ No newline at end of file +#endif diff --git a/config/eds_cf_msgdefs.h b/config/eds_cf_msgdefs.h index 53a76786..76744c3d 100644 --- a/config/eds_cf_msgdefs.h +++ b/config/eds_cf_msgdefs.h @@ -28,4 +28,4 @@ #include "cf_eds_typedefs.h" #include "cf_fcncodes.h" -#endif \ No newline at end of file +#endif diff --git a/docs/dox_src/cfs_cf.dox b/docs/dox_src/cfs_cf.dox index 3778eb44..fb378ee1 100644 --- a/docs/dox_src/cfs_cf.dox +++ b/docs/dox_src/cfs_cf.dox @@ -398,23 +398,23 @@ When files are found in a polling directory that is enabled, the files are automatically queued by CF for output. The polling rate is configurable and each channel has a configurable number of polling directories. Each polling - directory has an enable, a class setting, a priority setting, a destination - directory. When enabled, CF will periodically check the polling directories - for files. When a file is found, CF will place the file information on the - pending queue if it is closed and not already on the queue and not currently - active. All polling directories are checked at the same frequency which is - defined by the table parameter NumWakeupsPerPollDirChk. Setting this parameter - to one will cause CF to check the polling directories at the fastest possible - rate, every time it receives a 'wake-up' command. Checking polling directories - is a processor-intensive effort, it is best to keep the polling rate as low as + directory has an enable, a class setting, a priority setting, a destination + directory. When enabled, CF will periodically check the polling directories + for files. When a file is found, CF will place the file information on the + pending queue if it is closed and not already on the queue and not currently + active. All polling directories are checked at the same frequency which is + defined by the table parameter NumWakeupsPerPollDirChk. Setting this parameter + to one will cause CF to check the polling directories at the fastest possible + rate, every time it receives a 'wake-up' command. Checking polling directories + is a processor-intensive effort, it is best to keep the polling rate as low as possible.

Failed Transmit and directory use

- - Currently, the fail directory is used only to store class 2 TX files that failed - during transmission from a polling directory. When a file fails during transmission - from a polling directory, it is deleted from the polling directory to prevent an - infinite loop and moved to the fail directory. However, if a file fails during a + + Currently, the fail directory is used only to store class 2 TX files that failed + during transmission from a polling directory. When a file fails during transmission + from a polling directory, it is deleted from the polling directory to prevent an + infinite loop and moved to the fail directory. However, if a file fails during a class 2 TX outside of a polling directory, the file will not be deleted.

Efficiency

@@ -612,19 +612,11 @@ \verbatim * \par Command Structure - * #CF_UnionArgs_Payload_t where byte[0] specifies the counters type, byte[1-3] don't care: * - 0 = all counters * - 1 = command counters * - 2 = fault counters * - 3 = up counters * - 4 = down counters - typedef union CF_UnionArgs_Payload - { - uint32 dword; - uint16 hword[2]; - uint8 byte[4]; - } -CF_UnionArgs_Payload_t; \endverbatim The command parameter byte[0] identifies which category of counters to @@ -653,8 +645,8 @@ CF_UnionArgs_Payload_t; and an event will be generated. If the command is not successful, the command error counter will increment and - an error event will be generated indicating the reason for failure. File will - not be deleted if the 'transmit' failed (unless in an polling directories). + an error event will be generated indicating the reason for failure. File will + not be deleted if the 'transmit' failed (unless in an polling directories). \verbatim typedef struct CF_TxFileCmd @@ -671,7 +663,7 @@ CF_UnionArgs_Payload_t; \endverbatim The first parameter, \c cfdp_class, identifies whether the file will be transferred - using #CF_CFDP_CLASS_1 or #CF_CFDP_CLASS_2. For Class 1 transfers, CF will send the data + using #CF_CFDP_Class_1 or #CF_CFDP_Class_2. For Class 1 transfers, CF will send the data once and expect no feedback from the peer. Class 2 transfers are more reliable and attempt to fill in data that may have been dropped on the first attempt. @@ -741,7 +733,7 @@ CF_UnionArgs_Payload_t; \endverbatim The first parameter, \c cfdp_class, identifies whether the files will be - transferred using #CF_CFDP_CLASS_1 or #CF_CFDP_CLASS_2. For Class 1 transfers, CF will + transferred using #CF_CFDP_Class_1 or #CF_CFDP_Class_2. For Class 1 transfers, CF will send the data once and expect no feedback from the peer. Class 2 transfers are more reliable and attempt to fill in data that may have been dropped on the first attempt. @@ -1109,15 +1101,9 @@ CF_UnionArgs_Payload_t; \verbatim * Command Structure - * #CF_UnionArgs_Payload_t where byte[0] specifies the channel number or all channels - * - 255 = all channels + * Single byte channel selector + * - 255 (0xFF) = all channels * - else = single channel - typedef union CF_UnionArgs_Payload - { - uint32 dword; - uint16 hword[2]; - uint8 byte[4]; - } CF_UnionArgs_Payload_t; \endverbatim The first and only parameter, \c byte[0], specifies which pending queue to enable. @@ -1147,16 +1133,9 @@ CF_UnionArgs_Payload_t; \verbatim * Command Structure - * #CF_UnionArgs_Payload_t where byte[0] specifies the channel number or all channels + * Single byte channel selector * - 255 = all channels * - else = single channel - - typedef union CF_UnionArgs_Payload - { - uint32 dword; - uint16 hword[2]; - uint8 byte[4]; - } CF_UnionArgs_Payload_t; \endverbatim The first and only parameter, \c byte[0], specifies which pending queue to enable. @@ -1185,23 +1164,14 @@ CF_UnionArgs_Payload_t; \verbatim * Command Structure - * #CF_UnionArgs_Payload_t - * - * byte[0] specifies the channel number or all channels + * Single byte channel selector * - 255 = all channels * - else = single channel * - * byte[1] specifies the polling directory index + * Single byte polling directory index * - 255 = all polling directories * - else = single polling directory index * - - typedef union CF_UnionArgs_Payload - { - uint32 dword; - uint16 hword[2]; - uint8 byte[4]; - } CF_UnionArgs_Payload_t; \endverbatim The first parameter, \c byte[0], specifies which channel contains the polling @@ -1237,23 +1207,13 @@ CF_UnionArgs_Payload_t; \verbatim * Command Structure - * #CF_UnionArgs_Payload_t - * - * byte[0] specifies the channel number or all channels + * Single byte channel selector * - 255 = all channels * - else = single channel * - * byte[1] specifies the polling directory index + * Single byte polling directory index * - 255 = all polling directories * - else = single polling directory index - * - - typedef union CF_UnionArgs_Payload - { - uint32 dword; - uint16 hword[2]; - uint8 byte[4]; - } CF_UnionArgs_Payload_t; \endverbatim The first parameter, \c byte[0], specifies which channel contains the polling @@ -1285,24 +1245,14 @@ CF_UnionArgs_Payload_t; \verbatim * Command Structure - * #CF_UnionArgs_Payload_t - * - * byte[0] specifies the channel number or all channels + * Single byte channel selector * - 255 = all channels * - else = single channel * - * byte[1] specifies the queue + * Single byte queue index * - 0 = Pending queue * - 1 = History queue * - 2 = Both pending and history queue - * - - typedef union CF_UnionArgs_Payload - { - uint32 dword; - uint16 hword[2]; - uint8 byte[4]; - } CF_UnionArgs_Payload_t; \endverbatim The first parameter, \c byte[0], specifies a single channel id or a value diff --git a/eds/cf.xml b/eds/cf.xml index 21edcbc8..20199da3 100644 --- a/eds/cf.xml +++ b/eds/cf.xml @@ -72,15 +72,35 @@ - + + + + + + + + + + + + + + - + - - + + + + + + + + + + + + @@ -121,7 +141,7 @@ - + @@ -184,7 +204,7 @@ - + @@ -236,7 +256,7 @@ - + @@ -275,7 +295,7 @@ - + @@ -315,30 +335,65 @@ - + + + + + - - - - - + + + Single byte channel selector payload + - 255 = all channels + - else = single channel + + + + + - - - - - + + + Polling directory selector payload - + Single byte channel selector + - 255 = all channels + - else = single channel + + Single byte polling directory index + - 255 = all polling directories + - else = single polling directory index + + + + + + + + + + Queue selector payload + + Single byte channel selector + - 255 = all channels + - else = single channel + + Single byte queue selection enum + Values indicated by #CF_QueueSelect enum + - 0 = Pending queue + - 1 = History queue + - 2 = Both pending and history queue + - + + - + @@ -346,16 +401,16 @@ - + - + - + @@ -386,7 +441,7 @@ - + @@ -397,7 +452,7 @@ - + @@ -474,7 +529,7 @@ - + @@ -593,7 +648,7 @@ - + @@ -634,7 +689,7 @@ - + @@ -962,7 +1017,7 @@ - + @@ -1002,7 +1057,7 @@ - + @@ -1049,7 +1104,7 @@ - + @@ -1096,7 +1151,7 @@ - + @@ -1144,7 +1199,7 @@ - + diff --git a/fsw/inc/cf_eventids.h b/fsw/inc/cf_eventids.h index 894e6e15..c37fbe9f 100644 --- a/fsw/inc/cf_eventids.h +++ b/fsw/inc/cf_eventids.h @@ -57,28 +57,6 @@ */ #define CF_INIT_TBL_CHECK_REL_ERR_EID 21 -/** - * \brief CF Check Table Manage Failed Event ID - * - * \par Type: ERROR - * - * \par Cause: - * - * Failure from manage table call during periodic table check - */ -#define CF_INIT_TBL_CHECK_MAN_ERR_EID 22 - -/** - * \brief CF Check Table Get Address Failed Event ID - * - * \par Type: ERROR - * - * \par Cause: - * - * Failure from get table call during periodic table check - */ -#define CF_INIT_TBL_CHECK_GA_ERR_EID 23 - /** * \brief CF Table Registration At Initialization Failed Event ID * diff --git a/fsw/inc/cf_fcncodes.h b/fsw/inc/cf_fcncodes.h index 7fa1b1aa..3aa298b5 100644 --- a/fsw/inc/cf_fcncodes.h +++ b/fsw/inc/cf_fcncodes.h @@ -74,7 +74,7 @@ * Resets the requested housekeeping counters * * \par Command Structure - * #CF_UnionArgs_Payload_t where byte[0] specifies the counters type, byte[1-3] don't care: + * Single byte enumeration * - 0 = all counters * - 1 = command counters * - 2 = fault counters @@ -172,7 +172,7 @@ * this could cause failures for class 2 transactions in progress. * * \par Command Structure - * #CF_UnionArgs_Payload_t where byte[0] specifies the channel number or all channels + * Single byte channel selector * - 255 = all channels * - else = single channel * @@ -206,7 +206,7 @@ * for the specified channel, note received messages are consumed either way. * * \par Command Structure - * #CF_UnionArgs_Payload_t where byte[0] specifies the channel number or all channels + * Single byte channel selector * - 255 = all channels * - else = single channel * @@ -478,7 +478,7 @@ * Enables the sending of file data PDUs. * * \par Command Structure - * #CF_UnionArgs_Payload_t where byte[0] specifies the channel number or all channels + * Single byte channel selector * - 255 = all channels * - else = single channel * @@ -511,7 +511,7 @@ * Disables the sending of file data PDUs. * * \par Command Structure - * #CF_UnionArgs_Payload_t where byte[0] specifies the channel number or all channels + * Single byte channel selector * - 255 = all channels * - else = single channel * @@ -544,13 +544,12 @@ * Enables the processing of polling directories * * \par Command Structure - * #CF_UnionArgs_Payload_t * - * byte[0] specifies the channel number or all channels + * Single byte channel selector * - 255 = all channels * - else = single channel * - * byte[1] specifies the polling directory index + * Single byte polling directory index * - 255 = all polling directories * - else = single polling directory index * @@ -584,13 +583,12 @@ * Disable the processing of polling directories * * \par Command Structure - * #CF_UnionArgs_Payload_t * - * byte[0] specifies the channel number or all channels + * Single byte channel selector * - 255 = all channels * - else = single channel * - * byte[1] specifies the polling directory index + * Single byte polling directory index * - 255 = all polling directories * - else = single polling directory index * @@ -624,13 +622,12 @@ * Purge the requested queue * * \par Command Structure - * #CF_UnionArgs_Payload_t * - * byte[0] specifies the channel number or all channels + * Single byte channel selector * - 255 = all channels * - else = single channel * - * byte[1] specifies the queue + * Single byte queue selection enum * - 0 = Pending queue * - 1 = History queue * - 2 = Both pending and history queue diff --git a/fsw/src/cf_app.c b/fsw/src/cf_app.c index 96db059a..d7468faf 100644 --- a/fsw/src/cf_app.c +++ b/fsw/src/cf_app.c @@ -33,6 +33,7 @@ #include "cf_cfdp.h" #include "cf_version.h" #include "cf_dispatch.h" +#include "cf_utils.h" #include "cf_tbl.h" #include @@ -41,60 +42,167 @@ CF_AppData_t CF_AppData; /*---------------------------------------------------------------- * - * Application-scope internal function - * See description in cf_app.h for argument/return detail + * Local helper function + * Imports configuration from table for a single channel + * Compatible with CF_ForEachChannel() * *-----------------------------------------------------------------*/ -void CF_CheckTables(void) +static int32 CF_DoChannelConfig(CF_Engine_t *engine_ptr, CF_Channel_t *chan, void *arg) { - CFE_Status_t status; + const CF_ConfigTable_t *config = arg; + const int chan_num = CF_ChannelSelect_AsInt(CF_GetChannelFromPtr(chan)); + const CF_ChannelConfig_t *chan_config = &config->chan[chan_num]; + const CF_PollDir_t *tbl_pd_config; + CF_LocalPdConfig_t *pd_config; + int pd; + + chan->config.max_outgoing_messages_per_wakeup = chan_config->max_outgoing_messages_per_wakeup; + chan->config.rx_max_messages_per_wakeup = chan_config->rx_max_messages_per_wakeup; + chan->config.ack_timer_s = chan_config->ack_timer_s; + chan->config.nak_timer_s = chan_config->nak_timer_s; + chan->config.inactivity_timer_s = chan_config->inactivity_timer_s; + chan->config.ack_limit = chan_config->ack_limit; + chan->config.nak_limit = chan_config->nak_limit; + chan->config.mid_input = chan_config->mid_input; + chan->config.mid_output = chan_config->mid_output; + chan->config.pipe_depth_input = chan_config->pipe_depth_input; + chan->config.dequeue_enabled = chan_config->dequeue_enabled; + + CFE_SB_MessageStringGet(chan->config.sem_name, + chan_config->sem_name, + "", + sizeof(chan->config.sem_name), + sizeof(chan_config->sem_name)); + CFE_SB_MessageStringGet(chan->config.move_dir, + chan_config->move_dir, + "", + sizeof(chan->config.move_dir), + sizeof(chan_config->move_dir)); + + for (pd = 0; pd < CF_MAX_POLLING_DIR_PER_CHAN; ++pd) + { + tbl_pd_config = &chan_config->polldir[pd]; + pd_config = &chan->config.polldir[pd]; + + pd_config->enabled = tbl_pd_config->enabled; + pd_config->priority = tbl_pd_config->priority; + pd_config->interval_sec = tbl_pd_config->interval_sec; + pd_config->cfdp_class = tbl_pd_config->cfdp_class; + pd_config->dest_eid = tbl_pd_config->dest_eid; + + CFE_SB_MessageStringGet(pd_config->src_dir, + tbl_pd_config->src_dir, + "", + sizeof(pd_config->src_dir), + sizeof(tbl_pd_config->src_dir)); + CFE_SB_MessageStringGet(pd_config->dst_dir, + tbl_pd_config->dst_dir, + "", + sizeof(pd_config->dst_dir), + sizeof(tbl_pd_config->dst_dir)); + } - /* check the table for an update only if engine is disabled */ - if (!CF_AppData.engine.enabled) + return CFE_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Local helper function + * Checks for table updates + * + *-----------------------------------------------------------------*/ +static CFE_Status_t CF_ManageTables(CF_Engine_t *engine_ptr, bool always_import) +{ + CFE_Status_t status; + void *table_addr; + const CF_ConfigTable_t *config; + + /* + * NOTE: As of CFE 7.0 (Caelum), some the CFE TBL APIs return success codes + * other than CFE_SUCCESS, so it is not sufficient to check for only this + * result here. For example they may return something like CFE_TBL_INFO_UPDATED. + * But from the standpoint of this routine, they are all success, because the + * function still did its expected job. + * + * For now, the safest way to check is to check for negative values, + * as the alt-success codes are in the positive range by design, and + * error codes are all in the negative range of CFE_Status_t. + * + * This should continue to work even if CFE TBL APIs change to + * remove the problematic alt-success codes at some point. + */ + status = CFE_TBL_Manage(CF_AppData.config_handle); + if (status < CFE_SUCCESS) + { + CFE_EVS_SendEvent(CF_INIT_TBL_MANAGE_ERR_EID, + CFE_EVS_EventType_ERROR, + "CF: error in CFE_TBL_Manage, returned 0x%08lx", + (unsigned long)status); + } + else if (always_import || status == CFE_TBL_INFO_UPDATED) { - /* - * NOTE: As of CFE 7.0 (Caelum), some the CFE TBL APIs return success codes - * other than CFE_SUCCESS, so it is not sufficient to check for only this - * result here. For example they may return something like CFE_TBL_INFO_UPDATED. - * But from the standpoint of this routine, they are all success, because the - * function still did its expected job. - * - * For now, the safest way to check is to check for negative values, - * as the alt-success codes are in the positive range by design, and - * error codes are all in the negative range of CFE_Status_t. - * - * This should continue to work even if CFE TBL APIs change to - * remove the problematic alt-success codes at some point. - */ - status = CFE_TBL_ReleaseAddress(CF_AppData.config_handle); + status = CFE_TBL_GetAddress(&table_addr, CF_AppData.config_handle); if (status < CFE_SUCCESS) { - CFE_EVS_SendEvent(CF_INIT_TBL_CHECK_REL_ERR_EID, + CFE_EVS_SendEvent(CF_INIT_TBL_GETADDR_ERR_EID, CFE_EVS_EventType_ERROR, - "CF: error in CFE_TBL_ReleaseAddress (check), returned 0x%08lx", + "CF: failed to get table address, returned 0x%08lx", (unsigned long)status); - CF_AppData.RunStatus = CFE_ES_RunStatus_APP_ERROR; } - - status = CFE_TBL_Manage(CF_AppData.config_handle); - if (status < CFE_SUCCESS) + else { - CFE_EVS_SendEvent(CF_INIT_TBL_CHECK_MAN_ERR_EID, - CFE_EVS_EventType_ERROR, - "CF: error in CFE_TBL_Manage (check), returned 0x%08lx", - (unsigned long)status); - CF_AppData.RunStatus = CFE_ES_RunStatus_APP_ERROR; + config = table_addr; + + engine_ptr->config.ticks_per_second = config->ticks_per_second; + engine_ptr->config.rx_crc_calc_bytes_per_wakeup = config->rx_crc_calc_bytes_per_wakeup; + engine_ptr->config.local_eid = config->local_eid; + engine_ptr->config.outgoing_file_chunk_size = config->outgoing_file_chunk_size; + + CFE_SB_MessageStringGet(engine_ptr->config.tmp_dir, + config->tmp_dir, + "", + sizeof(engine_ptr->config.tmp_dir), + sizeof(config->tmp_dir)); + CFE_SB_MessageStringGet(engine_ptr->config.fail_dir, + config->fail_dir, + "", + sizeof(engine_ptr->config.fail_dir), + sizeof(config->fail_dir)); + + CF_ForEachChannel(engine_ptr, CF_DoChannelConfig, table_addr); + + /* Release the address, the config is now in the CF global data */ + status = CFE_TBL_ReleaseAddress(CF_AppData.config_handle); + if (status < CFE_SUCCESS) + { + CFE_EVS_SendEvent(CF_INIT_TBL_CHECK_REL_ERR_EID, + CFE_EVS_EventType_ERROR, + "CF: error in CFE_TBL_ReleaseAddress, returned 0x%08lx", + (unsigned long)status); + } } + } - status = CFE_TBL_GetAddress((void *)&CF_AppData.config_table, CF_AppData.config_handle); - if (status < CFE_SUCCESS) - { - CFE_EVS_SendEvent(CF_INIT_TBL_CHECK_GA_ERR_EID, - CFE_EVS_EventType_ERROR, - "CF: failed to get table address (check), returned 0x%08lx", - (unsigned long)status); - CF_AppData.RunStatus = CFE_ES_RunStatus_APP_ERROR; - } + return status; +} + +/*---------------------------------------------------------------- + * + * Application-scope internal function + * See description in cf_app.h for argument/return detail + * + *-----------------------------------------------------------------*/ +void CF_CheckTables(void) +{ + CF_Engine_t *engine_ptr = CF_GetEngine(); + + /* check the table for an update only if engine is disabled */ + if (!engine_ptr->enabled) + { + /* NOTE: We do not need to abort the app if this fails, it can + * keep running with the existing config in RAM. A failure here only + * means that the config is not applied */ + CF_ManageTables(engine_ptr, false); } } @@ -165,34 +273,9 @@ CFE_Status_t CF_TableInit(void) "CF: error loading table, returned 0x%08lx", (unsigned long)status); } - } - - if (status == CFE_SUCCESS) - { - status = CFE_TBL_Manage(CF_AppData.config_handle); - if (status != CFE_SUCCESS) - { - CFE_EVS_SendEvent(CF_INIT_TBL_MANAGE_ERR_EID, - CFE_EVS_EventType_ERROR, - "CF: error in CFE_TBL_Manage, returned 0x%08lx", - (unsigned long)status); - } - } - - if (status == CFE_SUCCESS) - { - status = CFE_TBL_GetAddress((void **)&CF_AppData.config_table, CF_AppData.config_handle); - /* status will be CFE_TBL_INFO_UPDATED because it was just loaded, but we can use CFE_SUCCESS too */ - if ((status != CFE_TBL_INFO_UPDATED) && (status != CFE_SUCCESS)) - { - CFE_EVS_SendEvent(CF_INIT_TBL_GETADDR_ERR_EID, - CFE_EVS_EventType_ERROR, - "CF: error getting table address, returned 0x%08lx", - (unsigned long)status); - } else { - status = CFE_SUCCESS; + status = CF_ManageTables(CF_GetEngine(), true); } } @@ -216,8 +299,6 @@ CFE_Status_t CF_AppInit(void) CF_AppData.RunStatus = CFE_ES_RunStatus_APP_RUN; - CFE_MSG_Init(CFE_MSG_PTR(CF_AppData.hk.TelemetryHeader), CFE_SB_ValueToMsgId(CF_HK_TLM_MID), sizeof(CF_AppData.hk)); - status = CFE_EVS_Register(NULL, 0, CFE_EVS_EventFilter_BINARY); if (status != CFE_SUCCESS) { @@ -258,7 +339,7 @@ CFE_Status_t CF_AppInit(void) if (status == CFE_SUCCESS) { - status = CF_CFDP_InitEngine(); /* function sends event internally */ + status = CF_CFDP_InitEngine(CF_GetEngine()); /* function sends event internally */ } if (status == CFE_SUCCESS) diff --git a/fsw/src/cf_app.h b/fsw/src/cf_app.h index 344a79db..d8b97357 100644 --- a/fsw/src/cf_app.h +++ b/fsw/src/cf_app.h @@ -84,14 +84,11 @@ */ typedef struct { - CF_HkPacket_t hk; - uint32 RunStatus; - CFE_SB_PipeId_t CmdPipe; - - CFE_TBL_Handle_t config_handle; - CF_ConfigTable_t *config_table; + CF_HkCmdCounters_t counters; + CFE_SB_PipeId_t CmdPipe; + CFE_TBL_Handle_t config_handle; CF_Engine_t engine; } CF_AppData_t; @@ -113,6 +110,180 @@ extern CF_AppData_t CF_AppData; ** **************************************************************************/ +/************************************************************************/ +/** + * @brief Gets the CFDP engine struct + * + * @par Description + * Obtains a pointer to the CFDP engine. + * + * @par Assumptions, External Events, and Notes: + * This is currently a singleon in the CF app, but the architecture + * does permit there to be more than one. + * + * This never returns NULL, in the current implementation there is + * one (and only one) engine. + * + * @returns engine pointer + */ +static inline CF_Engine_t *CF_GetEngine(void) +{ + return &CF_AppData.engine; +} + +/************************************************************************/ +/** + * @brief Checks if a class identifier is valid + * + * @par Description + * checks if the given class number matches one of the defined enum values + * + * @par Assumptions, External Events, and Notes: + * None + * + * @retval true if value is valid/acceptable + * @retval false if value is invalid + */ +static inline bool CF_IsValidClass(CF_CFDP_Class_Enum_t cv) +{ + return (cv == CF_CFDP_Class_1 || cv == CF_CFDP_Class_2); +} + +/************************************************************************/ +/** + * @brief Checks if a channel identifier is valid + * + * @par Description + * checks if the given channel number matches one of the defined values + * + * @par Assumptions, External Events, and Notes: + * This only checks if it matches a single channel. It does not test + * for the special values that some commands might accept. + * + * @retval true if value is valid/acceptable + * @retval false if value is invalid + */ +static inline bool CF_IsValidChannel(CF_ChannelSelect_t cs) +{ + return (cs < CF_NUM_CHANNELS); +} + +/************************************************************************/ +/** + * @brief Checks if a channel identifier represents "all channels" + * + * @par Description + * checks if the given channel number matches the special all channels value + * + * @par Assumptions, External Events, and Notes: + * This only checks if it matches all channels. + * + * @retval true if value is valid/acceptable + * @retval false if value is invalid + */ +static inline bool CF_IsAllChannels(CF_ChannelSelect_t cs) +{ + return (cs == CF_ALL_CHANNELS); +} + +/************************************************************************/ +/** + * @brief Checks if a channel identifier represents "all channels" + * + * @par Description + * checks if the given channel number matches the special all channels value + * + * @par Assumptions, External Events, and Notes: + * This only checks if it matches all channels. + * + * @retval true if value is valid/acceptable + * @retval false if value is invalid + */ +static inline bool CF_IsCompoundKey(CF_ChannelSelect_t cs) +{ + return (cs == CF_COMPOUND_KEY); +} + +/************************************************************************/ +/** + * @brief Gets the channel number as an integer + * + * @par Description + * For consistent representation of channel numbers in logs messages + * and other strings. + * + * @par Assumptions, External Events, and Notes: + * Format log messages with printf "%d" conversion + * + * @returns channel number represented as "int" type + */ +static inline int CF_ChannelSelect_AsInt(CF_ChannelSelect_t cs) +{ + return (cs); +} + +/************************************************************************/ +/** + * @brief Gets the channel number from integer + * + * @par Description + * For intentional conversion from an integer value to a channel number + * + * @par Assumptions, External Events, and Notes: + * this exists for special/corner cases only, should really not be + * needed in general. Prefer to use the APIs that invoke a subroutine + * using the standard selector logic. + * + * @returns channel number value + */ +static inline CF_ChannelSelect_t CF_ChannelSelect_FromInt(int c) +{ + return (c); +} + +/************************************************************************/ +/** + * @brief Gets the channel pointer from a channel number + * + * @par Description + * Obtains the channel pointer associated with the channel number + * + * @par Assumptions, External Events, and Notes: + * This implements range-checking and may return NULL + * + * @returns channel pointer + * @retval NULL if channel number is invalid + */ +static inline CF_Channel_t *CF_GetChannelPtr(CF_ChannelSelect_t cs) +{ + if (CF_IsValidChannel(cs)) + { + return &CF_GetEngine()->channels[cs]; + } + else + { + return NULL; + } +} + +/************************************************************************/ +/** + * @brief Gets the channel number from a channel pointer + * + * @par Description + * Obtains the channel number associated with the channel pointer + * + * @par Assumptions, External Events, and Notes: + * This is primarily for log messages. + * + * @returns channel number + */ +static inline CF_ChannelSelect_t CF_GetChannelFromPtr(const CF_Channel_t *ChanPtr) +{ + CF_Engine_t *engine_ptr = CF_GetEngine(); + return (CF_ChannelSelect_t) { (ChanPtr - engine_ptr->channels) }; +} + /************************************************************************/ /** @brief Checks to see if a table update is pending, and perform it. * diff --git a/fsw/src/cf_cfdp.c b/fsw/src/cf_cfdp.c index 5433fe7d..ab693389 100644 --- a/fsw/src/cf_cfdp.c +++ b/fsw/src/cf_cfdp.c @@ -46,6 +46,19 @@ #include #include "cf_assert.h" +/** + * State data for engine init + * + * Tracks the next engine pointers to use + */ +typedef struct CF_EngineInitState +{ + CF_History_t *history; + CF_Transaction_t *txn; + CF_ChunkWrapper_t *cw; + size_t chunk_mem_offset; +} CF_EngineInitState_t; + /*---------------------------------------------------------------- * * Application-scope internal function @@ -128,7 +141,8 @@ void CF_CFDP_DecodeStart(CF_DecoderState_t *pdec, *-----------------------------------------------------------------*/ void CF_CFDP_ArmAckTimer(CF_Transaction_t *txn) { - CF_Timer_InitRelSec(&txn->ack_timer, CF_AppData.config_table->chan[txn->chan_num].ack_timer_s); + const CF_Channel_t *chan = CF_GetChannelFromTxn(txn); + CF_Timer_InitRelSec(&txn->ack_timer, chan->config.ack_timer_s); txn->flags.com.ack_timer_armed = true; } @@ -162,13 +176,14 @@ static inline bool CF_CFDP_IsSender(CF_Transaction_t *txn) *-----------------------------------------------------------------*/ void CF_CFDP_ArmInactTimer(CF_Transaction_t *txn) { - CF_Timer_Seconds_t Sec; + const CF_Channel_t *chan = CF_GetChannelFromTxn(txn); + CF_Timer_Seconds_t Sec; /* select timeout based on the state */ if (CF_CFDP_GetAckTxnStatus(txn) == CF_CFDP_AckTxnStatus_ACTIVE) { /* in an active transaction, we expect traffic so use the normal inactivity timer */ - Sec = CF_AppData.config_table->chan[txn->chan_num].inactivity_timer_s; + Sec = chan->config.inactivity_timer_s; } else { @@ -179,7 +194,7 @@ void CF_CFDP_ArmInactTimer(CF_Transaction_t *txn) * timeout would hold resources longer than needed). Using double the ack timer should * ensure that if the remote retransmitted anything, we will see it, and avoids adding * another config option just for this. */ - Sec = CF_AppData.config_table->chan[txn->chan_num].ack_timer_s * 2; + Sec = chan->config.ack_timer_s * 2; } CF_Timer_InitRelSec(&txn->inactivity_timer, Sec); @@ -193,12 +208,13 @@ void CF_CFDP_ArmInactTimer(CF_Transaction_t *txn) *-----------------------------------------------------------------*/ bool CF_CFDP_CheckAckNakCount(CF_Transaction_t *txn, uint8 *counter) { - bool is_ok; - uint16 Event; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); + bool is_ok; + uint16 Event; /* Check limit and handle if needed */ Event = 0; - is_ok = (*counter < CF_AppData.config_table->chan[txn->chan_num].ack_limit); + is_ok = (*counter < chan->config.ack_limit); if (is_ok) { @@ -208,7 +224,7 @@ bool CF_CFDP_CheckAckNakCount(CF_Transaction_t *txn, uint8 *counter) else { /* Reached limit */ - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.ack_limit; + ++chan->stat.counters.fault.ack_limit; if (txn->history->dir == CF_Direction_TX) { @@ -326,7 +342,7 @@ CF_Logical_PduBuffer_t *CF_CFDP_ConstructPduHeader(const CF_Transaction_t *txn, hdr->version = 1; hdr->pdu_type = (directive_code == 0); /* set to '1' for file data PDU, '0' for a directive PDU */ hdr->direction = (towards_sender != false); /* set to '1' for toward sender, '0' for toward receiver */ - hdr->txm_mode = (CF_CFDP_GetClass(txn) == CF_CFDP_CLASS_1); /* set to '1' for class 1 data, '0' for class 2 */ + hdr->txm_mode = (CF_CFDP_GetClass(txn) == CF_CFDP_Class_1); /* set to '1' for class 1 data, '0' for class 2 */ /* choose the larger of the two EIDs to determine size */ if (src_eid > dst_eid) @@ -380,9 +396,10 @@ CF_Logical_PduBuffer_t *CF_CFDP_ConstructPduHeader(const CF_Transaction_t *txn, *-----------------------------------------------------------------*/ CFE_Status_t CF_CFDP_SendMd(CF_Transaction_t *txn) { - CF_Logical_PduBuffer_t *ph = CF_CFDP_ConstructPduHeader(txn, + CF_Engine_t *engine_ptr = CF_GetEngine(); + CF_Logical_PduBuffer_t *ph = CF_CFDP_ConstructPduHeader(txn, CF_CFDP_FileDirective_METADATA, - CF_AppData.config_table->local_eid, + engine_ptr->config.local_eid, txn->history->peer_eid, 0, txn->history->seq_num, @@ -414,7 +431,7 @@ CFE_Status_t CF_CFDP_SendMd(CF_Transaction_t *txn) CF_CFDP_EncodeMd(ph->penc, md); CF_CFDP_SetPduLength(ph); - CF_CFDP_Send(txn->chan_num, ph); + CF_CFDP_Send(CF_GetChannelFromTxn(txn), ph); CF_TRACE("%s(): Sent MD, size=%lu, cr=%d, ct=%d\n", __func__, @@ -441,7 +458,7 @@ CFE_Status_t CF_CFDP_SendFd(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) /* update PDU length */ CF_CFDP_SetPduLength(ph); - CF_CFDP_Send(txn->chan_num, ph); + CF_CFDP_Send(CF_GetChannelFromTxn(txn), ph); return ret; } @@ -455,6 +472,7 @@ CFE_Status_t CF_CFDP_SendFd(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) void CF_CFDP_AppendTlv(CF_Logical_TlvList_t *ptlv_list, CF_CFDP_TlvType_t tlv_type) { CF_Logical_Tlv_t *ptlv; + CF_Engine_t *engine_ptr = CF_GetEngine(); if (ptlv_list->num_tlv < CF_PDU_MAX_TLV) { @@ -472,7 +490,7 @@ void CF_CFDP_AppendTlv(CF_Logical_TlvList_t *ptlv_list, CF_CFDP_TlvType_t tlv_ty if (tlv_type == CF_CFDP_TLV_TYPE_ENTITY_ID) { - ptlv->data.eid = CF_AppData.config_table->local_eid; + ptlv->data.eid = engine_ptr->config.local_eid; ptlv->length = CF_CFDP_GetValueEncodedSize(ptlv->data.eid); } else @@ -491,9 +509,10 @@ void CF_CFDP_AppendTlv(CF_Logical_TlvList_t *ptlv_list, CF_CFDP_TlvType_t tlv_ty *-----------------------------------------------------------------*/ CFE_Status_t CF_CFDP_SendEof(CF_Transaction_t *txn) { - CF_Logical_PduBuffer_t *ph = CF_CFDP_ConstructPduHeader(txn, + CF_Engine_t *engine_ptr = CF_GetEngine(); + CF_Logical_PduBuffer_t *ph = CF_CFDP_ConstructPduHeader(txn, CF_CFDP_FileDirective_EOF, - CF_AppData.config_table->local_eid, + engine_ptr->config.local_eid, txn->history->peer_eid, 0, txn->history->seq_num, @@ -520,7 +539,7 @@ CFE_Status_t CF_CFDP_SendEof(CF_Transaction_t *txn) CF_CFDP_EncodeEof(ph->penc, eof); CF_CFDP_SetPduLength(ph); - CF_CFDP_Send(txn->chan_num, ph); + CF_CFDP_Send(CF_GetChannelFromTxn(txn), ph); CF_TRACE("%s(): Sent EOF, cc=%d, crc=%08lx, size=%lu\n", __func__, @@ -542,7 +561,8 @@ CFE_Status_t CF_CFDP_SendAck(CF_Transaction_t *txn, CF_CFDP_FileDirective_t dir_ { CF_Logical_PduBuffer_t *ph; CF_Logical_PduAck_t *ack; - CFE_Status_t ret = CFE_SUCCESS; + CFE_Status_t ret = CFE_SUCCESS; + CF_Engine_t *engine_ptr = CF_GetEngine(); CF_Assert((dir_code == CF_CFDP_FileDirective_EOF) || (dir_code == CF_CFDP_FileDirective_FIN)); @@ -550,7 +570,7 @@ CFE_Status_t CF_CFDP_SendAck(CF_Transaction_t *txn, CF_CFDP_FileDirective_t dir_ { ph = CF_CFDP_ConstructPduHeader(txn, CF_CFDP_FileDirective_ACK, - CF_AppData.config_table->local_eid, + engine_ptr->config.local_eid, txn->history->peer_eid, false, txn->history->seq_num, @@ -561,7 +581,7 @@ CFE_Status_t CF_CFDP_SendAck(CF_Transaction_t *txn, CF_CFDP_FileDirective_t dir_ ph = CF_CFDP_ConstructPduHeader(txn, CF_CFDP_FileDirective_ACK, txn->history->peer_eid, - CF_AppData.config_table->local_eid, + engine_ptr->config.local_eid, true, txn->history->seq_num, 0); @@ -589,7 +609,7 @@ CFE_Status_t CF_CFDP_SendAck(CF_Transaction_t *txn, CF_CFDP_FileDirective_t dir_ CF_CFDP_EncodeAck(ph->penc, ack); CF_CFDP_SetPduLength(ph); - CF_CFDP_Send(txn->chan_num, ph); + CF_CFDP_Send(CF_GetChannelFromTxn(txn), ph); CF_TRACE("%s(): Sent ACK, dir_code=%d, cc=%d, st=%d\n", __func__, @@ -612,11 +632,12 @@ CFE_Status_t CF_CFDP_SendFin(CF_Transaction_t *txn) CF_Logical_PduBuffer_t *ph; CF_Logical_PduFin_t *fin; CFE_Status_t ret; + CF_Engine_t *engine_ptr = CF_GetEngine(); ph = CF_CFDP_ConstructPduHeader(txn, CF_CFDP_FileDirective_FIN, txn->history->peer_eid, - CF_AppData.config_table->local_eid, + engine_ptr->config.local_eid, 1, txn->history->seq_num, 0); @@ -641,7 +662,7 @@ CFE_Status_t CF_CFDP_SendFin(CF_Transaction_t *txn) CF_CFDP_EncodeFin(ph->penc, fin); CF_CFDP_SetPduLength(ph); - CF_CFDP_Send(txn->chan_num, ph); + CF_CFDP_Send(CF_GetChannelFromTxn(txn), ph); CF_TRACE("%s(): Sent FIN, cc=%d, dc=%d, st=%d\n", __func__, @@ -663,7 +684,7 @@ void CF_CFDP_SendNak(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) { CF_Logical_PduNak_t *nak; - CF_Assert(CF_CFDP_GetClass(txn) == CF_CFDP_CLASS_2); + CF_Assert(CF_CFDP_GetClass(txn) == CF_CFDP_Class_2); nak = &ph->int_header.nak; @@ -674,7 +695,7 @@ void CF_CFDP_SendNak(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) CF_CFDP_EncodeNak(ph->penc, nak); CF_CFDP_SetPduLength(ph); - CF_CFDP_Send(txn->chan_num, ph); + CF_CFDP_Send(CF_GetChannelFromTxn(txn), ph); /* The timer needs to be armed after this, lack of response will need a re-nak */ CF_CFDP_ArmAckTimer(txn); @@ -688,11 +709,10 @@ void CF_CFDP_SendNak(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) * See description in cf_cfdp.h for argument/return detail * *-----------------------------------------------------------------*/ -CFE_Status_t CF_CFDP_RecvPh(uint8 chan_num, CF_Logical_PduBuffer_t *ph) +CFE_Status_t CF_CFDP_RecvPh(CF_Channel_t *chan, CF_Logical_PduBuffer_t *ph) { CFE_Status_t ret = CFE_SUCCESS; - CF_Assert(chan_num < CF_NUM_CHANNELS); /* * If the source eid, destination eid, or sequence number fields * are larger than the sizes configured in the cf platform config @@ -703,7 +723,7 @@ CFE_Status_t CF_CFDP_RecvPh(uint8 chan_num, CF_Logical_PduBuffer_t *ph) CFE_EVS_SendEvent(CF_PDU_TRUNCATION_ERR_EID, CFE_EVS_EventType_ERROR, "CF: PDU rejected due to EID/seq number field truncation"); - ++CF_AppData.hk.Payload.channel_hk[chan_num].counters.recv.error; + ++chan->stat.counters.recv.error; ret = CF_ERROR; } /* @@ -717,7 +737,7 @@ CFE_Status_t CF_CFDP_RecvPh(uint8 chan_num, CF_Logical_PduBuffer_t *ph) CFE_EVS_SendEvent(CF_PDU_LARGE_FILE_ERR_EID, CFE_EVS_EventType_ERROR, "CF: PDU with large file bit received (unsupported)"); - ++CF_AppData.hk.Payload.channel_hk[chan_num].counters.recv.error; + ++chan->stat.counters.recv.error; ret = CF_ERROR; } else @@ -733,13 +753,13 @@ CFE_Status_t CF_CFDP_RecvPh(uint8 chan_num, CF_Logical_PduBuffer_t *ph) CFE_EVS_EventType_ERROR, "CF: PDU too short (%lu received)", (unsigned long)CF_CODEC_GET_SIZE(ph->pdec)); - ++CF_AppData.hk.Payload.channel_hk[chan_num].counters.recv.error; + ++chan->stat.counters.recv.error; ret = CF_SHORT_PDU_ERROR; } else { /* PDU is ok, so continue processing */ - ++CF_AppData.hk.Payload.channel_hk[chan_num].counters.recv.pdu; + ++chan->stat.counters.recv.pdu; } } @@ -754,7 +774,8 @@ CFE_Status_t CF_CFDP_RecvPh(uint8 chan_num, CF_Logical_PduBuffer_t *ph) *-----------------------------------------------------------------*/ CFE_Status_t CF_CFDP_RecvMd(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) { - const CF_Logical_PduMd_t *md = &ph->int_header.md; + const CF_Logical_PduMd_t *md = &ph->int_header.md; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); int lv_ret; CFE_Status_t ret = CFE_SUCCESS; @@ -765,7 +786,7 @@ CFE_Status_t CF_CFDP_RecvMd(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) CFE_EVS_EventType_ERROR, "CF: metadata packet too short: %lu bytes received", (unsigned long)CF_CODEC_GET_SIZE(ph->pdec)); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.error; + ++chan->stat.counters.recv.error; ret = CF_PDU_METADATA_ERROR; } else @@ -795,7 +816,7 @@ CFE_Status_t CF_CFDP_RecvMd(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) (unsigned long)txn->history->src_eid, (unsigned long)txn->history->seq_num, md->source_filename.length); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.error; + ++chan->stat.counters.recv.error; ret = CF_PDU_METADATA_ERROR; } else @@ -812,7 +833,7 @@ CFE_Status_t CF_CFDP_RecvMd(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) (unsigned long)txn->history->src_eid, (unsigned long)txn->history->seq_num, md->dest_filename.length); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.error; + ++chan->stat.counters.recv.error; ret = CF_PDU_METADATA_ERROR; } else @@ -840,7 +861,8 @@ CFE_Status_t CF_CFDP_RecvMd(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) *-----------------------------------------------------------------*/ CFE_Status_t CF_CFDP_RecvFd(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) { - CFE_Status_t ret = CFE_SUCCESS; + CFE_Status_t ret = CFE_SUCCESS; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); CF_CFDP_DecodeFileDataHeader(ph->pdec, ph->pdu_header.segment_meta_flag, &ph->int_header.fd); @@ -863,7 +885,7 @@ CFE_Status_t CF_CFDP_RecvFd(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) CFE_EVS_EventType_ERROR, "CF: filedata PDU too short: %lu bytes received", (unsigned long)CF_CODEC_GET_SIZE(ph->pdec)); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.error; + ++chan->stat.counters.recv.error; ret = CF_SHORT_PDU_ERROR; } else if (ph->pdu_header.segment_meta_flag) @@ -872,7 +894,7 @@ CFE_Status_t CF_CFDP_RecvFd(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) CFE_EVS_SendEvent(CF_PDU_FD_UNSUPPORTED_ERR_EID, CFE_EVS_EventType_ERROR, "CF: filedata PDU with segment metadata received"); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.error; + ++chan->stat.counters.recv.error; ret = CF_ERROR; } @@ -986,7 +1008,8 @@ CFE_Status_t CF_CFDP_RecvNak(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) *-----------------------------------------------------------------*/ void CF_CFDP_RecvDrop(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) { - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.dropped; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); + ++chan->stat.counters.recv.dropped; } /*---------------------------------------------------------------- @@ -997,8 +1020,10 @@ void CF_CFDP_RecvDrop(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) *-----------------------------------------------------------------*/ void CF_CFDP_RecvHold(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) { + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); + /* anything received in this state is considered spurious */ - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.spurious; + ++chan->stat.counters.recv.spurious; /* * Normally we do not expect PDUs for a transaction in holdover, because @@ -1155,11 +1180,11 @@ void CF_CFDP_SetupRxTransaction(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *p void CF_CFDP_ReceivePdu(CF_Channel_t *chan, CF_Logical_PduBuffer_t *ph) { CF_Transaction_t *txn; - uint8 chan_num = (chan - CF_AppData.engine.channels); + CF_Engine_t *engine_ptr = CF_GetEngine(); /* This decodes the header in the PDU. If it fails it sends the relevent event * and increments any necessary counters. */ - if (CF_CFDP_RecvPh(chan_num, ph) != CFE_SUCCESS) + if (CF_CFDP_RecvPh(chan, ph) != CFE_SUCCESS) { /* drop it, nothing more to do */ return; @@ -1171,10 +1196,10 @@ void CF_CFDP_ReceivePdu(CF_Channel_t *chan, CF_Logical_PduBuffer_t *ph) { /* if no match found, then check if we are the destination entity id. * If so then this would be the first PDU of an RX transaction */ - if (ph->pdu_header.destination_eid == CF_AppData.config_table->local_eid) + if (ph->pdu_header.destination_eid == engine_ptr->config.local_eid) { /* we didn't find a match, so assign it to a transaction */ - txn = CF_CFDP_StartRxTransaction(chan_num); + txn = CF_CFDP_StartRxTransaction(chan); if (txn == NULL) { CFE_EVS_SendEvent( @@ -1210,176 +1235,204 @@ void CF_CFDP_ReceivePdu(CF_Channel_t *chan, CF_Logical_PduBuffer_t *ph) /*---------------------------------------------------------------- * - * Application-scope internal function - * See description in cf_cfdp.h for argument/return detail + * Internal helper routine only, not part of API. + * Initializes a single channel within the engine. + * Compatible with CF_ForEachChannel() * *-----------------------------------------------------------------*/ -CFE_Status_t CF_CFDP_InitEngine(void) +static int32 CF_CFDP_DoEngineChannelInit(CF_Engine_t *engine_ptr, CF_Channel_t *chan, void *arg) { - /* initialize all transaction nodes */ - CF_History_t *history; - CF_Transaction_t *txn = CF_AppData.engine.transactions; - CF_ChunkWrapper_t *cw = CF_AppData.engine.chunks; - CF_CListNode_t **list_head; - CFE_Status_t ret = CFE_SUCCESS; - int chunk_mem_offset = 0; - int i; - int j; - int k; - char nbuf[64]; - static const int CF_DIR_MAX_CHUNKS[CF_Direction_NUM][CF_NUM_CHANNELS] = { CF_CHANNEL_NUM_RX_CHUNKS_PER_TRANSACTION, CF_CHANNEL_NUM_TX_CHUNKS_PER_TRANSACTION }; - memset(&CF_AppData.engine, 0, sizeof(CF_AppData.engine)); + CF_EngineInitState_t *state = arg; + CF_CListNode_t **list_head; + int j; + int k; + const int chan_num = CF_ChannelSelect_AsInt(CF_GetChannelFromPtr(chan)); + char nbuf[64]; + CFE_Status_t ret = CFE_SUCCESS; - /* Ensure that the temp directory exists (ignore error if it already exists) */ - OS_mkdir(CF_AppData.config_table->tmp_dir, 0); + snprintf(nbuf, sizeof(nbuf) - 1, "%s%d", CF_CHANNEL_PIPE_PREFIX, chan_num); + ret = CFE_SB_CreatePipe(&chan->pipe, chan->config.pipe_depth_input, nbuf); + if (ret != CFE_SUCCESS) + { + CFE_EVS_SendEvent(CF_CR_CHANNEL_PIPE_ERR_EID, + CFE_EVS_EventType_ERROR, + "CF: failed to create pipe %s, returned 0x%08lx", + nbuf, + (unsigned long)ret); + return ret; + } - for (i = 0; i < CF_NUM_CHANNELS; ++i) + ret = CFE_SB_SubscribeLocal(CFE_SB_ValueToMsgId(chan->config.mid_input), chan->pipe, chan->config.pipe_depth_input); + if (ret != CFE_SUCCESS) { - snprintf(nbuf, sizeof(nbuf) - 1, "%s%d", CF_CHANNEL_PIPE_PREFIX, i); - ret = CFE_SB_CreatePipe(&CF_AppData.engine.channels[i].pipe, - CF_AppData.config_table->chan[i].pipe_depth_input, - nbuf); - if (ret != CFE_SUCCESS) + CFE_EVS_SendEvent(CF_INIT_SUB_ERR_EID, + CFE_EVS_EventType_ERROR, + "CF: failed to subscribe to MID 0x%lx, returned 0x%08lx", + (unsigned long)chan->config.mid_input, + (unsigned long)ret); + return ret; + } + + if (chan->config.sem_name[0]) + { + /* + * There is a start up race condition because CFE starts all apps at the same time, + * and if this sem is instantiated by another app, it may not be created yet. + * + * Therefore if OSAL returns OS_ERR_NAME_NOT_FOUND, assume this is what is going + * on, delay a bit and try again. + */ + ret = OS_ERR_NAME_NOT_FOUND; + for (j = 0; j < CF_STARTUP_SEM_MAX_RETRIES; ++j) { - CFE_EVS_SendEvent(CF_CR_CHANNEL_PIPE_ERR_EID, - CFE_EVS_EventType_ERROR, - "CF: failed to create pipe %s, returned 0x%08lx", - nbuf, - (unsigned long)ret); - break; + ret = OS_CountSemGetIdByName(&chan->sem_id, chan->config.sem_name); + + if (ret != OS_ERR_NAME_NOT_FOUND) + { + break; + } + + OS_TaskDelay(CF_STARTUP_SEM_TASK_DELAY); } - ret = CFE_SB_SubscribeLocal(CFE_SB_ValueToMsgId(CF_AppData.config_table->chan[i].mid_input), - CF_AppData.engine.channels[i].pipe, - CF_AppData.config_table->chan[i].pipe_depth_input); - if (ret != CFE_SUCCESS) + if (ret != OS_SUCCESS) { - CFE_EVS_SendEvent(CF_INIT_SUB_ERR_EID, + CFE_EVS_SendEvent(CF_INIT_SEM_ERR_EID, CFE_EVS_EventType_ERROR, - "CF: failed to subscribe to MID 0x%lx, returned 0x%08lx", - (unsigned long)CF_AppData.config_table->chan[i].mid_input, - (unsigned long)ret); - break; + "CF: failed to get sem id for name %s, error=%ld", + chan->config.sem_name, + (long)ret); + return ret; } + } - if (CF_AppData.config_table->chan[i].sem_name[0]) - { - /* - * There is a start up race condition because CFE starts all apps at the same time, - * and if this sem is instantiated by another app, it may not be created yet. - * - * Therefore if OSAL returns OS_ERR_NAME_NOT_FOUND, assume this is what is going - * on, delay a bit and try again. - */ - ret = OS_ERR_NAME_NOT_FOUND; - for (j = 0; j < CF_STARTUP_SEM_MAX_RETRIES; ++j) - { - ret = OS_CountSemGetIdByName(&CF_AppData.engine.channels[i].sem_id, - CF_AppData.config_table->chan[i].sem_name); + for (j = 0; j < CF_NUM_TRANSACTIONS_PER_CHANNEL; ++j) + { + /* Initially put this on the free list for this channel */ + state->txn->chan_ptr = chan; + CF_CList_InitNode(&state->txn->cl_node); + CF_CList_InsertBack_Ex(chan, CF_QueueIdx_FREE, &state->txn->cl_node); + ++state->txn; - if (ret != OS_ERR_NAME_NOT_FOUND) - { - break; - } + for (k = 0; k < CF_Direction_NUM; ++k) + { + list_head = CF_GetChunkListHead(chan, k); - OS_TaskDelay(CF_STARTUP_SEM_TASK_DELAY); - } + CF_ChunkListInit(&state->cw->chunks, + CF_DIR_MAX_CHUNKS[k][chan_num], + &engine_ptr->chunk_mem[state->chunk_mem_offset]); + state->chunk_mem_offset += CF_DIR_MAX_CHUNKS[k][chan_num]; + CF_CList_InitNode(&state->cw->cl_node); + CF_CList_InsertBack(list_head, &state->cw->cl_node); - if (ret != OS_SUCCESS) - { - CFE_EVS_SendEvent(CF_INIT_SEM_ERR_EID, - CFE_EVS_EventType_ERROR, - "CF: failed to get sem id for name %s, error=%ld", - CF_AppData.config_table->chan[i].sem_name, - (long)ret); - break; - } + ++state->cw; } + } - for (j = 0; j < CF_NUM_TRANSACTIONS_PER_CHANNEL; ++j, ++txn) - { - /* Initially put this on the free list for this channel */ - CF_FreeTransaction(txn, i); + for (j = 0; j < CF_NUM_HISTORIES_PER_CHANNEL; ++j) + { + CF_CList_InitNode(&state->history->cl_node); + CF_CList_InsertBack_Ex(chan, CF_QueueIdx_HIST_FREE, &state->history->cl_node); - for (k = 0; k < CF_Direction_NUM; ++k, ++cw) - { - list_head = CF_GetChunkListHead(&CF_AppData.engine.channels[i], k); + ++state->history; + } - CF_Assert((chunk_mem_offset + CF_DIR_MAX_CHUNKS[k][i]) <= CF_NUM_CHUNKS_ALL_CHANNELS); - CF_ChunkListInit(&cw->chunks, CF_DIR_MAX_CHUNKS[k][i], &CF_AppData.engine.chunk_mem[chunk_mem_offset]); - chunk_mem_offset += CF_DIR_MAX_CHUNKS[k][i]; - CF_CList_InitNode(&cw->cl_node); - CF_CList_InsertBack(list_head, &cw->cl_node); - } - } + return CFE_SUCCESS; +} - for (j = 0; j < CF_NUM_HISTORIES_PER_CHANNEL; ++j) - { - history = &CF_AppData.engine.histories[(i * CF_NUM_HISTORIES_PER_CHANNEL) + j]; - CF_CList_InitNode(&history->cl_node); - CF_CList_InsertBack_Ex(&CF_AppData.engine.channels[i], CF_QueueIdx_HIST_FREE, &history->cl_node); - } - } +/*---------------------------------------------------------------- + * + * Application-scope internal function + * See description in cf_cfdp.h for argument/return detail + * + *-----------------------------------------------------------------*/ +CFE_Status_t CF_CFDP_InitEngine(CF_Engine_t *engine_ptr) +{ + CFE_Status_t ret; + CF_EngineInitState_t state; + + /* NOTE: Not clearing the engine global struct here. + * It was already cleared at the beginning of CF_AppInit(), and + * since then the configuration was imported from the table. Clearing + * the global would wipe that configuration data. */ + + /* Ensure that the temp directory exists (ignore error if it already exists) */ + OS_mkdir(engine_ptr->config.tmp_dir, 0); + + memset(&state, 0, sizeof(state)); + state.history = engine_ptr->histories; + state.txn = engine_ptr->transactions; + state.cw = engine_ptr->chunks; + + ret = CF_ForEachChannel(engine_ptr, CF_CFDP_DoEngineChannelInit, &state); if (ret == CFE_SUCCESS) { - CF_AppData.engine.enabled = true; + engine_ptr->enabled = true; } + CF_Assert(state.chunk_mem_offset <= CF_NUM_CHUNKS_ALL_CHANNELS); + return ret; } /*---------------------------------------------------------------- * - * Application-scope internal function + * Local helper function function * See description in cf_cfdp.h for argument/return detail * *-----------------------------------------------------------------*/ -void CF_CFDP_S_Tick_NewData(CF_Transaction_t *txn) +static void CF_CFDP_S_Tick_SendFileData(CF_Transaction_t *txn) { + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); + const int chan_num = CF_ChannelSelect_AsInt(CF_GetChannelFromPtr(chan)); /* for perf log */ uint32 last_outgoing_counter; - CF_Channel_t *chan; - if (!txn->flags.com.suspended && txn->state_data.sub_state == CF_TxSubState_DATA_NORMAL) - { - /* this is a candidate for sending data */ - chan = CF_GetChannelFromTxn(txn); - } - else - { - chan = NULL; - } + CF_Assert(chan); - if (chan != NULL) + /* + * Run the TXN - Every call to DispatchTx should produce an outgoing PDU. + * If it does not, then it means this is blocked for some reason. Do not keep + * looping the same TXN if it is not making progress. Exit this loop and + * come back next tick. + * + * On the next tick, the state will be checked by the tick processor and + * may change out of DATA_NORMAL if necessary. Otherwise if it stays in + * DATA_NORMAL we will simply resume. + * + * Note the loop here is to adhere to the priority ordering. Items in the TX + * queue are ordered by priority so we should focus only on the first entry + * when sending new file data, then return CF_CLIST_EXIT to stop. If we exited + * with CF_CLIST_CONT it would effectively round robin between all entries. + */ + do { - /* - * Run the TXN - Every call to DispatchTx should produce an outgoing PDU. - * If it does not, then it means this is blocked for some reason. Do not keep - * looping the same TXN if it is not making progress. Exit this loop and - * come back next tick. - * - * On the next tick, the state will be checked by the tick processor and - * may change out of DATA_NORMAL if necessary. Otherwise if it stays in - * DATA_NORMAL we will simply resume. - * - * Note the loop here is to adhere to the priority ordering. Items in the TX - * queue are ordered by priority so we should focus only on the first entry - * when sending new file data, then return CF_CLIST_EXIT to stop. If we exited - * with CF_CLIST_CONT it would effectively round robin between all entries. - */ - do - { - last_outgoing_counter = chan->outgoing_counter; + last_outgoing_counter = chan->outgoing_counter; - CFE_ES_PerfLogEntry(CF_PERF_ID_PDUSENT(txn->chan_num)); - CF_CFDP_S_SubstateSendFileData(txn); - CFE_ES_PerfLogExit(CF_PERF_ID_PDUSENT(txn->chan_num)); - } while (last_outgoing_counter != chan->outgoing_counter); + CFE_ES_PerfLogEntry(CF_PERF_ID_PDUSENT(chan_num)); + CF_CFDP_S_SubstateSendFileData(txn); + CFE_ES_PerfLogExit(CF_PERF_ID_PDUSENT(chan_num)); + + } while (last_outgoing_counter != chan->outgoing_counter); +} + +/*---------------------------------------------------------------- + * + * Application-scope internal function + * See description in cf_cfdp.h for argument/return detail + * + *-----------------------------------------------------------------*/ +void CF_CFDP_S_Tick_NewData(CF_Transaction_t *txn) +{ + if (!txn->flags.com.suspended && txn->state_data.sub_state == CF_TxSubState_DATA_NORMAL) + { + /* this is a candidate for sending data */ + CF_CFDP_S_Tick_SendFileData(txn); } } @@ -1575,12 +1628,16 @@ void CF_CFDP_TickTransactions(CF_Channel_t *chan) * See description in cf_cfdp.h for argument/return detail * *-----------------------------------------------------------------*/ -void CF_CFDP_InitTxnTxFile(CF_Transaction_t *txn, CF_CFDP_Class_t cfdp_class, uint8 keep, uint8 chan, uint8 priority) +void CF_CFDP_InitTxnTxFile(CF_Transaction_t *txn, + CF_CFDP_Class_t cfdp_class, + uint8 keep, + CF_Channel_t *chan, + uint8 priority) { - txn->chan_num = chan; + txn->chan_ptr = chan; txn->priority = priority; txn->keep = keep; - txn->reliable_mode = cfdp_class; + txn->reliable_mode = (cfdp_class == CF_CFDP_Class_2); txn->state = txn->reliable_mode ? CF_TxnState_S2 : CF_TxnState_S1; } @@ -1592,15 +1649,17 @@ void CF_CFDP_InitTxnTxFile(CF_Transaction_t *txn, CF_CFDP_Class_t cfdp_class, ui static void CF_CFDP_TxFile_Initiate(CF_Transaction_t *txn, CF_CFDP_Class_t cfdp_class, uint8 keep, - uint8 chan, + CF_Channel_t *chan, uint8 priority, CF_EntityId_t dest_id) { + CF_Engine_t *engine_ptr = CF_GetEngine(); + CFE_EVS_SendEvent(CF_CFDP_S_START_SEND_INF_EID, CFE_EVS_EventType_INFORMATION, "CF: start class %d tx of file %lu:%.*s -> %lu:%.*s", cfdp_class + 1, - (unsigned long)CF_AppData.config_table->local_eid, + (unsigned long)engine_ptr->config.local_eid, CF_FILENAME_MAX_LEN, txn->history->fnames.src_filename, (unsigned long)dest_id, @@ -1610,11 +1669,11 @@ static void CF_CFDP_TxFile_Initiate(CF_Transaction_t *txn, CF_CFDP_InitTxnTxFile(txn, cfdp_class, keep, chan, priority); /* Increment sequence number for new transaction */ - ++CF_AppData.engine.seq_num; + ++engine_ptr->seq_num; /* Capture info for history */ - txn->history->seq_num = CF_AppData.engine.seq_num; - txn->history->src_eid = CF_AppData.config_table->local_eid; + txn->history->seq_num = engine_ptr->seq_num; + txn->history->src_eid = engine_ptr->config.local_eid; txn->history->peer_eid = dest_id; CF_InsertSortPrio(txn, CF_QueueIdx_PEND); @@ -1630,21 +1689,21 @@ CFE_Status_t CF_CFDP_TxFile(const char *src_filename, const char *dst_filename, CF_CFDP_Class_t cfdp_class, uint8 keep, - uint8 chan_num, + CF_Channel_t *chan, uint8 priority, CF_EntityId_t dest_id) { CF_Transaction_t *txn; - CF_Channel_t *chan = &CF_AppData.engine.channels[chan_num]; - CF_Assert(chan_num < CF_NUM_CHANNELS); + + CF_Assert(chan != NULL); CFE_Status_t ret = CFE_SUCCESS; - CF_TRACE("%s(): start, channel=%d\n", __func__, (int)chan_num); + CF_TRACE("%s(): start, channel=%d\n", __func__, CF_ChannelSelect_AsInt(CF_GetChannelFromPtr(chan))); if (chan->num_cmd_tx < CF_MAX_COMMANDED_PLAYBACK_FILES_PER_CHAN) { - txn = CF_FindUnusedTransaction(&CF_AppData.engine.channels[chan_num], CF_Direction_TX); + txn = CF_FindUnusedTransaction(chan, CF_Direction_TX); } else { @@ -1665,7 +1724,7 @@ CFE_Status_t CF_CFDP_TxFile(const char *src_filename, txn->history->fnames.src_filename[sizeof(txn->history->fnames.src_filename) - 1] = 0; strncpy(txn->history->fnames.dst_filename, dst_filename, sizeof(txn->history->fnames.dst_filename) - 1); txn->history->fnames.dst_filename[sizeof(txn->history->fnames.dst_filename) - 1] = 0; - CF_CFDP_TxFile_Initiate(txn, cfdp_class, keep, chan_num, priority, dest_id); + CF_CFDP_TxFile_Initiate(txn, cfdp_class, keep, chan, priority, dest_id); ++chan->num_cmd_tx; txn->flags.tx.cmd_tx = true; @@ -1680,14 +1739,13 @@ CFE_Status_t CF_CFDP_TxFile(const char *src_filename, * See description in cf_cfdp.h for argument/return detail * *-----------------------------------------------------------------*/ -CF_Transaction_t *CF_CFDP_StartRxTransaction(uint8 chan_num) +CF_Transaction_t *CF_CFDP_StartRxTransaction(CF_Channel_t *chan) { - CF_Channel_t *chan = &CF_AppData.engine.channels[chan_num]; CF_Transaction_t *txn; - CF_TRACE("%s(): start, channel=%d\n", __func__, (int)chan_num); + CF_TRACE("%s(): start, channel=%d\n", __func__, CF_ChannelSelect_AsInt(CF_GetChannelFromPtr(chan))); - if (CF_AppData.hk.Payload.channel_hk[chan_num].q_size[CF_QueueIdx_RX] < CF_MAX_SIMULTANEOUS_RX) + if (chan->stat.q_size[CF_QueueIdx_RX] < CF_MAX_SIMULTANEOUS_RX) { txn = CF_FindUnusedTransaction(chan, CF_Direction_RX); } @@ -1716,7 +1774,7 @@ static CFE_Status_t CF_CFDP_PlaybackDir_Initiate(CF_Playback_t *pb, const char *dst_filename, CF_CFDP_Class_t cfdp_class, uint8 keep, - uint8 chan, + CF_Channel_t *chan, uint8 priority, CF_EntityId_t dest_id) { @@ -1731,7 +1789,7 @@ static CFE_Status_t CF_CFDP_PlaybackDir_Initiate(CF_Playback_t *pb, "CF: failed to open playback directory %s, error=%ld", src_filename, (long)ret); - ++CF_AppData.hk.Payload.channel_hk[chan].counters.fault.directory_read; + ++chan->stat.counters.fault.directory_read; } else { @@ -1763,7 +1821,7 @@ CFE_Status_t CF_CFDP_PlaybackDir(const char *src_filename, const char *dst_filename, CF_CFDP_Class_t cfdp_class, uint8 keep, - uint8 chan, + CF_Channel_t *chan, uint8 priority, uint16 dest_id) { @@ -1772,7 +1830,7 @@ CFE_Status_t CF_CFDP_PlaybackDir(const char *src_filename, for (i = 0; i < CF_MAX_COMMANDED_PLAYBACK_DIRECTORIES_PER_CHAN; ++i) { - pb = &CF_AppData.engine.channels[chan].playback[i]; + pb = &chan->playback[i]; if (!pb->busy) { break; @@ -1854,12 +1912,7 @@ void CF_CFDP_ProcessPlaybackDirectory(CF_Channel_t *chan, CF_Playback_t *pb) CF_FILENAME_MAX_NAME - 1, pb->pending_file); - CF_CFDP_TxFile_Initiate(txn, - pb->cfdp_class, - pb->keep, - (chan - CF_AppData.engine.channels), - pb->priority, - pb->dest_id); + CF_CFDP_TxFile_Initiate(txn, pb->cfdp_class, pb->keep, chan, pb->priority, pb->dest_id); txn->pb = pb; ++pb->num_ts; @@ -1907,15 +1960,12 @@ static void CF_CFDP_UpdatePollPbCounted(CF_Playback_t *pb, int up, uint8 *counte *-----------------------------------------------------------------*/ static void CF_CFDP_ProcessPlaybackDirectories(CF_Channel_t *chan) { - int i; - const int chan_index = (chan - CF_AppData.engine.channels); + int i; for (i = 0; i < CF_MAX_COMMANDED_PLAYBACK_DIRECTORIES_PER_CHAN; ++i) { CF_CFDP_ProcessPlaybackDirectory(chan, &chan->playback[i]); - CF_CFDP_UpdatePollPbCounted(&chan->playback[i], - chan->playback[i].busy, - &CF_AppData.hk.Payload.channel_hk[chan_index].playback_counter); + CF_CFDP_UpdatePollPbCounted(&chan->playback[i], chan->playback[i].busy, &chan->stat.playback_counter); } } @@ -1927,19 +1977,17 @@ static void CF_CFDP_ProcessPlaybackDirectories(CF_Channel_t *chan) *-----------------------------------------------------------------*/ void CF_CFDP_ProcessPollingDirectories(CF_Channel_t *chan) { - CF_Poll_t *poll; - CF_ChannelConfig_t *cc; - CF_PollDir_t *pd; - int i; - int chan_index; - int count_check; - int ret; + CF_Poll_t *poll; + const CF_LocalChanConfig_t *cc; + const CF_LocalPdConfig_t *pd; + int i; + int count_check; + int ret; for (i = 0; i < CF_MAX_POLLING_DIR_PER_CHAN; ++i) { poll = &chan->poll[i]; - chan_index = (chan - CF_AppData.engine.channels); - cc = &CF_AppData.config_table->chan[chan_index]; + cc = &chan->config; pd = &cc->polldir[i]; count_check = 0; @@ -1961,7 +2009,7 @@ void CF_CFDP_ProcessPollingDirectories(CF_Channel_t *chan) pd->dst_dir, pd->cfdp_class, 0, - chan_index, + chan, pd->priority, pd->dest_eid); if (!ret) @@ -1990,42 +2038,50 @@ void CF_CFDP_ProcessPollingDirectories(CF_Channel_t *chan) count_check = 1; } - CF_CFDP_UpdatePollPbCounted(&poll->pb, count_check, &CF_AppData.hk.Payload.channel_hk[chan_index].poll_counter); + CF_CFDP_UpdatePollPbCounted(&poll->pb, count_check, &chan->stat.poll_counter); } } /*---------------------------------------------------------------- * - * Application-scope internal function - * See description in cf_cfdp.h for argument/return detail + * Local helper function + * Cycles a single channel within the CFDP engine + * Compatible with CF_ForEachChannel() * *-----------------------------------------------------------------*/ -void CF_CFDP_CycleEngine(void) +static int32 CF_CFDP_DoEngineChannelCycle(CF_Engine_t *engine_ptr, CF_Channel_t *chan, void *arg) { - CF_Channel_t *chan; - int i; + chan->outgoing_counter = 0; + chan->tx_blocked = false; + + /* consume all received messages, even if channel is frozen */ + CF_CFDP_ReceiveMessage(chan); - if (CF_AppData.engine.enabled) + if (!chan->stat.frozen) { - for (i = 0; i < CF_NUM_CHANNELS; ++i) - { - chan = &CF_AppData.engine.channels[i]; + /* cycle all transactions (tick) */ + CF_CFDP_TickTransactions(chan); - chan->outgoing_counter = 0; - chan->tx_blocked = false; + CF_CFDP_ProcessPlaybackDirectories(chan); + CF_CFDP_ProcessPollingDirectories(chan); + } - /* consume all received messages, even if channel is frozen */ - CF_CFDP_ReceiveMessage(chan); + return CFE_SUCCESS; +} - if (!CF_AppData.hk.Payload.channel_hk[i].frozen) - { - /* cycle all transactions (tick) */ - CF_CFDP_TickTransactions(chan); +/*---------------------------------------------------------------- + * + * Application-scope internal function + * See description in cf_cfdp.h for argument/return detail + * + *-----------------------------------------------------------------*/ +void CF_CFDP_CycleEngine(void) +{ + CF_Engine_t *engine_ptr = CF_GetEngine(); - CF_CFDP_ProcessPlaybackDirectories(chan); - CF_CFDP_ProcessPollingDirectories(chan); - } - } + if (engine_ptr->enabled) + { + CF_ForEachChannel(engine_ptr, CF_CFDP_DoEngineChannelCycle, NULL); } } @@ -2111,13 +2167,13 @@ void CF_CFDP_RecycleTransaction(CF_Transaction_t *txn) txn->fd = OS_OBJECT_ID_UNDEFINED; } - CF_DequeueTransaction(txn); /* this makes it "float" (not in any queue) */ - chan = CF_GetChannelFromTxn(txn); /* this should always be */ if (chan != NULL && txn->history != NULL) { + CF_DequeueTransaction(txn); /* this makes it "float" (not in any queue) */ + if (txn->chunks != NULL) { chunklist_head = CF_GetChunkListHead(chan, txn->history->dir); @@ -2137,6 +2193,7 @@ void CF_CFDP_RecycleTransaction(CF_Transaction_t *txn) { hist_destq = CF_QueueIdx_HIST_FREE; } + CF_CList_InsertBack_Ex(chan, hist_destq, &txn->history->cl_node); txn->history = NULL; } @@ -2144,7 +2201,7 @@ void CF_CFDP_RecycleTransaction(CF_Transaction_t *txn) /* this wipes it and puts it back onto the list to be found by * CF_FindUnusedTransaction(). Need to preserve the chan_num * and keep it associated with this channel, though. */ - CF_FreeTransaction(txn, txn->chan_num); + CF_FreeTransaction(txn); } /*---------------------------------------------------------------- @@ -2210,7 +2267,7 @@ void CF_CFDP_SendEotPkt(CF_Transaction_t *txn) CFE_MSG_Init(CFE_MSG_PTR(EotPktPtr->TelemetryHeader), CFE_SB_ValueToMsgId(CF_EOT_TLM_MID), sizeof(*EotPktPtr)); - EotPktPtr->Payload.channel = txn->chan_num; + EotPktPtr->Payload.channel = CF_GetChannelFromPtr(CF_GetChannelFromTxn(txn)); EotPktPtr->Payload.direction = txn->history->dir; EotPktPtr->Payload.fnames = txn->history->fnames; EotPktPtr->Payload.state = txn->state; @@ -2283,53 +2340,62 @@ CF_CListTraverse_Status_t CF_CFDP_CloseFiles(CF_CListNode_t *node, void *context /*---------------------------------------------------------------- * - * Application-scope internal function - * See description in cf_cfdp.h for argument/return detail + * Local helper function + * Closes/shuts down a single channel within the CFDP engine + * Compatible with CF_ForEachChannel() * *-----------------------------------------------------------------*/ -void CF_CFDP_DisableEngine(void) +static int32 CF_CFDP_DoCloseChannel(CF_Engine_t *engine_ptr, CF_Channel_t *chan, void *arg) { - int i; - int j; static const CF_QueueIdx_t CLOSE_QUEUES[] = { CF_QueueIdx_RX, CF_QueueIdx_TX }; - CF_Channel_t *chan; - CF_AppData.engine.enabled = false; + int j; - for (i = 0; i < CF_NUM_CHANNELS; ++i) + /* first, close all active files */ + for (j = 0; j < (sizeof(CLOSE_QUEUES) / sizeof(CLOSE_QUEUES[0])); ++j) { - chan = &CF_AppData.engine.channels[i]; + CF_CList_Traverse(chan->qs[CLOSE_QUEUES[j]], CF_CFDP_CloseFiles, NULL); + } - /* first, close all active files */ - for (j = 0; j < (sizeof(CLOSE_QUEUES) / sizeof(CLOSE_QUEUES[0])); ++j) + /* any playback directories need to have their directory ids closed */ + for (j = 0; j < CF_MAX_COMMANDED_PLAYBACK_DIRECTORIES_PER_CHAN; ++j) + { + if (chan->playback[j].busy) { - CF_CList_Traverse(chan->qs[CLOSE_QUEUES[j]], CF_CFDP_CloseFiles, NULL); + OS_DirectoryClose(chan->playback[j].dir_id); } + } - /* any playback directories need to have their directory ids closed */ - for (j = 0; j < CF_MAX_COMMANDED_PLAYBACK_DIRECTORIES_PER_CHAN; ++j) + for (j = 0; j < CF_MAX_POLLING_DIR_PER_CHAN; ++j) + { + if (chan->poll[j].pb.busy) { - if (chan->playback[j].busy) - { - OS_DirectoryClose(chan->playback[j].dir_id); - } + OS_DirectoryClose(chan->poll[j].pb.dir_id); } + } - for (j = 0; j < CF_MAX_POLLING_DIR_PER_CHAN; ++j) - { - if (chan->poll[j].pb.busy) - { - OS_DirectoryClose(chan->poll[j].pb.dir_id); - } - } + /* finally all queue counters must be reset */ + memset(&chan->stat.q_size, 0, sizeof(chan->stat.q_size)); - /* finally all queue counters must be reset */ - memset(&CF_AppData.hk.Payload.channel_hk[i].q_size, 0, sizeof(CF_AppData.hk.Payload.channel_hk[i].q_size)); + /* SAD: Suppress Ignored Return Value warning from CodeSonar. CFE_SB_DeletePipe() will send event message if + * there is any error */ + (void)CFE_SB_DeletePipe(chan->pipe); - /* SAD: Suppress Ignored Return Value warning from CodeSonar. CFE_SB_DeletePipe() will send event message if - * there is any error */ - (void)CFE_SB_DeletePipe(chan->pipe); - } + return CFE_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Application-scope internal function + * See description in cf_cfdp.h for argument/return detail + * + *-----------------------------------------------------------------*/ +void CF_CFDP_DisableEngine(void) +{ + CF_Engine_t *engine_ptr = CF_GetEngine(); + + engine_ptr->enabled = false; + CF_ForEachChannel(engine_ptr, CF_CFDP_DoCloseChannel, NULL); } /*---------------------------------------------------------------- @@ -2340,11 +2406,13 @@ void CF_CFDP_DisableEngine(void) *-----------------------------------------------------------------*/ void CF_CFDP_GetTempName(const CF_History_t *hist, char *FileNameBuf, size_t FileNameSize) { + CF_Engine_t *engine_ptr = CF_GetEngine(); + snprintf(FileNameBuf, FileNameSize, "%.*s/%lu_%lu.tmp", CF_FILENAME_MAX_PATH - 1, - CF_AppData.config_table->tmp_dir, + engine_ptr->config.tmp_dir, (unsigned long)hist->src_eid, (unsigned long)hist->seq_num); } diff --git a/fsw/src/cf_cfdp.h b/fsw/src/cf_cfdp.h index 3638660f..c1eb2d9b 100644 --- a/fsw/src/cf_cfdp.h +++ b/fsw/src/cf_cfdp.h @@ -225,11 +225,12 @@ void CF_CFDP_CompleteTick(CF_Transaction_t *txn); * @par Assumptions, External Events, and Notes: * Only called once. * + * @param engine_ptr CF engine pointer (must not be NULL) * @retval #CFE_SUCCESS \copydoc CFE_SUCCESS * @returns anything else on error. * */ -CFE_Status_t CF_CFDP_InitEngine(void); +CFE_Status_t CF_CFDP_InitEngine(CF_Engine_t *engine_ptr); /************************************************************************/ /** @brief Cycle the engine. Called once per wakeup. @@ -263,7 +264,7 @@ void CF_CFDP_DisableEngine(void); * @param dst_filename Remote filename * @param cfdp_class Whether to perform a class 1 or class 2 transfer * @param keep Whether to keep or delete the local file after completion - * @param chan CF channel number to use + * @param chan CF channel pointer (must not be NULL) * @param priority CF priority level * @param dest_id Entity ID of remote receiver * @@ -274,7 +275,7 @@ CFE_Status_t CF_CFDP_TxFile(const char *src_filename, const char *dst_filename, CF_CFDP_Class_t cfdp_class, uint8 keep, - uint8 chan, + CF_Channel_t *chan, uint8 priority, CF_EntityId_t dest_id); @@ -292,7 +293,7 @@ CFE_Status_t CF_CFDP_TxFile(const char *src_filename, * @param dst_filename Remote filename * @param cfdp_class Whether to perform a class 1 or class 2 transfer * @param keep Whether to keep or delete the local file after completion - * @param chan CF channel number to use + * @param chan CF channel pointer (must not be NULL) * @param priority CF priority level * @param dest_id Entity ID of remote receiver * @@ -303,7 +304,7 @@ CFE_Status_t CF_CFDP_PlaybackDir(const char *src_filename, const char *dst_filename, CF_CFDP_Class_t cfdp_class, uint8 keep, - uint8 chan, + CF_Channel_t *chan, uint8 priority, uint16 dest_id); @@ -453,7 +454,7 @@ void CF_CFDP_AppendTlv(CF_Logical_TlvList_t *ptlv_list, CF_CFDP_TlvType_t tlv_ty * @par Assumptions, External Events, and Notes: * A new message has been received. * - * @param chan_num The channel number for statistics purposes + * @param chan CF channel pointer (must not be NULL) * @param ph The logical PDU buffer being received * * @returns integer status code @@ -461,7 +462,7 @@ void CF_CFDP_AppendTlv(CF_Logical_TlvList_t *ptlv_list, CF_CFDP_TlvType_t tlv_ty * @retval CF_ERROR for general errors * @retval CF_SHORT_PDU_ERROR if PDU too short */ -CFE_Status_t CF_CFDP_RecvPh(uint8 chan_num, CF_Logical_PduBuffer_t *ph); +CFE_Status_t CF_CFDP_RecvPh(CF_Channel_t *chan, CF_Logical_PduBuffer_t *ph); /************************************************************************/ /** @brief Unpack a metadata PDU from a received message. @@ -610,11 +611,15 @@ void CF_CFDP_CancelTransaction(CF_Transaction_t *txn); * @param txn Pointer to the transaction state * @param cfdp_class Set to class 1 or class 2 * @param keep Whether to keep the local file - * @param chan CF channel number + * @param chan CF channel pointer (must not be NULL) * @param priority Priority of transfer * */ -void CF_CFDP_InitTxnTxFile(CF_Transaction_t *txn, CF_CFDP_Class_t cfdp_class, uint8 keep, uint8 chan, uint8 priority); +void CF_CFDP_InitTxnTxFile(CF_Transaction_t *txn, + CF_CFDP_Class_t cfdp_class, + uint8 keep, + CF_Channel_t *chan, + uint8 priority); /************************************************************************/ /** @brief Helper function to start a new RX transaction @@ -626,11 +631,11 @@ void CF_CFDP_InitTxnTxFile(CF_Transaction_t *txn, CF_CFDP_Class_t cfdp_class, ui * * If there is no capacity for another RX transaction, this returns NULL. * - * @param chan_num CF channel number + * @param chan CF channel pointer (must not be NULL) * @returns Pointer to new transaction * */ -CF_Transaction_t *CF_CFDP_StartRxTransaction(uint8 chan_num); +CF_Transaction_t *CF_CFDP_StartRxTransaction(CF_Channel_t *chan); /* functions to handle LVs (length-value, CFDP spec) */ /* returns number of bytes copied, or -1 on error */ diff --git a/fsw/src/cf_cfdp_dispatch.c b/fsw/src/cf_cfdp_dispatch.c index c5a360f3..a7bb4397 100644 --- a/fsw/src/cf_cfdp_dispatch.c +++ b/fsw/src/cf_cfdp_dispatch.c @@ -44,6 +44,7 @@ void CF_CFDP_R_DispatchRecv(CF_Transaction_t *txn, { CF_CFDP_StateRecvFunc_t selected_handler; CF_Logical_PduFileDirectiveHeader_t *fdh; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); selected_handler = NULL; @@ -60,7 +61,7 @@ void CF_CFDP_R_DispatchRecv(CF_Transaction_t *txn, } else { - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.spurious; + ++chan->stat.counters.recv.spurious; CFE_EVS_SendEvent(CF_CFDP_R_DC_INV_ERR_EID, CFE_EVS_EventType_ERROR, "CF R%d(%lu:%lu): received PDU with invalid directive code %d for sub-state %d", @@ -79,7 +80,7 @@ void CF_CFDP_R_DispatchRecv(CF_Transaction_t *txn, } else { - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.dropped; + ++chan->stat.counters.recv.dropped; } } @@ -106,6 +107,7 @@ void CF_CFDP_S_DispatchRecv(CF_Transaction_t *txn, const CF_CFDP_FileDirectiveDispatchTable_t *substate_tbl; CF_CFDP_StateRecvFunc_t selected_handler; CF_Logical_PduFileDirectiveHeader_t *fdh; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); /* send state, so we only care about file directive PDU */ selected_handler = NULL; @@ -123,7 +125,7 @@ void CF_CFDP_S_DispatchRecv(CF_Transaction_t *txn, } else { - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.spurious; + ++chan->stat.counters.recv.spurious; CFE_EVS_SendEvent(CF_CFDP_S_DC_INV_ERR_EID, CFE_EVS_EventType_ERROR, "CF S%d(%lu:%lu): received PDU with invalid directive code %d for sub-state %d", diff --git a/fsw/src/cf_cfdp_r.c b/fsw/src/cf_cfdp_r.c index a0b69092..61347e26 100644 --- a/fsw/src/cf_cfdp_r.c +++ b/fsw/src/cf_cfdp_r.c @@ -46,7 +46,8 @@ *-----------------------------------------------------------------*/ CFE_Status_t CF_CFDP_R_CheckCrc(CF_Transaction_t *txn) { - CFE_Status_t ret; + CFE_Status_t ret; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); if (txn->crc.result != txn->state_data.eof_crc) { @@ -58,7 +59,7 @@ CFE_Status_t CF_CFDP_R_CheckCrc(CF_Transaction_t *txn) (unsigned long)txn->history->seq_num, (unsigned long)txn->crc.result, (unsigned long)txn->state_data.eof_crc); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.crc_mismatch; + ++chan->stat.counters.fault.crc_mismatch; ret = CF_ERROR; } else @@ -111,6 +112,7 @@ CFE_Status_t CF_CFDP_R_ProcessFd(CF_Transaction_t *txn, CF_Logical_PduBuffer_t * const CF_Logical_PduFileDataHeader_t *fd; int32 fret; CFE_Status_t ret; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); /* this function is only entered for data PDUs */ fd = &ph->int_header.fd; @@ -136,7 +138,7 @@ CFE_Status_t CF_CFDP_R_ProcessFd(CF_Transaction_t *txn, CF_Logical_PduBuffer_t * (long)fd->offset, (long)fret); CF_CFDP_SetTxnStatus(txn, CF_TxnStatus_FILE_SIZE_ERROR); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.file_seek; + ++chan->stat.counters.fault.file_seek; ret = CF_ERROR; /* connection will reset in caller */ } else @@ -159,13 +161,13 @@ CFE_Status_t CF_CFDP_R_ProcessFd(CF_Transaction_t *txn, CF_Logical_PduBuffer_t * (long)fd->data_len, (long)fret); CF_CFDP_SetTxnStatus(txn, CF_TxnStatus_FILESTORE_REJECTION); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.file_write; + ++chan->stat.counters.fault.file_write; ret = CF_ERROR; /* connection will reset in caller */ } else { - txn->state_data.cached_pos = fd->data_len + fd->offset; - CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.file_data_bytes += fd->data_len; + txn->state_data.cached_pos = fd->data_len + fd->offset; + chan->stat.counters.recv.file_data_bytes += fd->data_len; /* insert gap data in chunks */ CF_ChunkListAdd(&txn->chunks->chunks, fd->offset, fd->data_len); @@ -185,6 +187,7 @@ void CF_CFDP_R_SubstateRecvEof(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph { CFE_Status_t ret = CFE_SUCCESS; const CF_Logical_PduEof_t *eof; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); /* this function is only entered for PDUs identified as EOF type */ ret = CF_CFDP_RecvEof(txn, ph); @@ -223,7 +226,7 @@ void CF_CFDP_R_SubstateRecvEof(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph CF_CFDP_GetPrintClass(txn), (unsigned long)txn->history->src_eid, (unsigned long)txn->history->seq_num); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.error; + ++chan->stat.counters.recv.error; } } @@ -296,16 +299,18 @@ void CF_CFDP_R2_GapCompute(const CF_ChunkList_t *chunks, const CF_Chunk_t *chunk *-----------------------------------------------------------------*/ CFE_Status_t CF_CFDP_R_SendNak(CF_Transaction_t *txn) { - CF_Logical_PduBuffer_t *ph = CF_CFDP_ConstructPduHeader(txn, + CF_Engine_t *engine_ptr = CF_GetEngine(); + CF_Logical_PduBuffer_t *ph = CF_CFDP_ConstructPduHeader(txn, CF_CFDP_FileDirective_NAK, txn->history->peer_eid, - CF_AppData.config_table->local_eid, + engine_ptr->config.local_eid, 1, txn->history->seq_num, 1); CF_Logical_PduNak_t *nak; uint32 cret; CFE_Status_t ret; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); if (ph == NULL) { @@ -350,7 +355,7 @@ CFE_Status_t CF_CFDP_R_SendNak(CF_Transaction_t *txn) { CF_CFDP_SendNak(txn, ph); - CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.sent.nak_segment_requests += cret; + chan->stat.counters.sent.nak_segment_requests += cret; } } else @@ -386,8 +391,9 @@ CFE_Status_t CF_CFDP_R_SendNak(CF_Transaction_t *txn) *-----------------------------------------------------------------*/ void CF_CFDP_R_Init(CF_Transaction_t *txn) { - int32 ret; - char TempName[CFE_MISSION_MAX_FILE_LEN]; + int32 ret; + char TempName[CFE_MISSION_MAX_FILE_LEN]; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); /* set default FIN status */ txn->state_data.fin_dc = CF_CFDP_FinDeliveryCode_INVALID; @@ -408,7 +414,7 @@ void CF_CFDP_R_Init(CF_Transaction_t *txn) TempName, (long)ret); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.file_open; + ++chan->stat.counters.fault.file_open; txn->fd = OS_OBJECT_ID_UNDEFINED; /* just in case */ CF_CFDP_SetTxnStatus(txn, CF_TxnStatus_FILESTORE_REJECTION); @@ -435,7 +441,8 @@ void CF_CFDP_R_Init(CF_Transaction_t *txn) *-----------------------------------------------------------------*/ void CF_CFDP_R_CalcCrcStart(CF_Transaction_t *txn) { - int32 OsStatus; + int32 OsStatus; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); if (txn->fsize != txn->state_data.eof_size) { @@ -463,7 +470,7 @@ void CF_CFDP_R_CalcCrcStart(CF_Transaction_t *txn) (unsigned long)txn->history->src_eid, (unsigned long)txn->history->seq_num, (long)OsStatus); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.file_seek; + ++chan->stat.counters.fault.file_seek; CF_CFDP_SetTxnStatus(txn, CF_TxnStatus_FILE_SIZE_ERROR); txn->flags.com.crc_complete = true; @@ -484,19 +491,20 @@ void CF_CFDP_R_CalcCrcStart(CF_Transaction_t *txn) *-----------------------------------------------------------------*/ void CF_CFDP_R_CalcCrcChunk(CF_Transaction_t *txn) { - uint8 buf[CF_R2_CRC_CHUNK_SIZE]; - size_t count_bytes; - size_t want_offs_size; - size_t read_size; - int fret; - bool success = true; + uint8 buf[CF_R2_CRC_CHUNK_SIZE]; + size_t count_bytes; + size_t want_offs_size; + size_t read_size; + int fret; + bool success = true; + CF_Engine_t *engine_ptr = CF_GetEngine(); + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); memset(buf, 0, sizeof(buf)); count_bytes = 0; - while ((count_bytes < CF_AppData.config_table->rx_crc_calc_bytes_per_wakeup) - && (txn->state_data.cached_pos < txn->fsize)) + while ((count_bytes < engine_ptr->config.rx_crc_calc_bytes_per_wakeup) && (txn->state_data.cached_pos < txn->fsize)) { want_offs_size = txn->state_data.cached_pos + sizeof(buf); @@ -521,7 +529,7 @@ void CF_CFDP_R_CalcCrcChunk(CF_Transaction_t *txn) (unsigned long)read_size, (long)fret); CF_CFDP_SetTxnStatus(txn, CF_TxnStatus_FILE_SIZE_ERROR); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.file_read; + ++chan->stat.counters.fault.file_read; success = false; break; } @@ -558,6 +566,7 @@ void CF_CFDP_R2_SubstateRecvFinAck(CF_Transaction_t *txn, CF_Logical_PduBuffer_t { CFE_Status_t status; CF_Logical_PduAck_t *ack; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); /* receipt of fin-ack is only valid if we had previously sent * a fin and it decodes as expected */ @@ -591,7 +600,7 @@ void CF_CFDP_R2_SubstateRecvFinAck(CF_Transaction_t *txn, CF_Logical_PduBuffer_t CF_CFDP_GetPrintClass(txn), (unsigned long)txn->history->src_eid, (unsigned long)txn->history->seq_num); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.error; + ++chan->stat.counters.recv.error; } } @@ -1129,6 +1138,7 @@ void CF_CFDP_R_Tick_Maintenance(CF_Transaction_t *txn) void CF_CFDP_R_Tick(CF_Transaction_t *txn) { CF_CFDP_AckTxnStatus_t CurrStatus; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); CurrStatus = CF_CFDP_GetAckTxnStatus(txn); @@ -1152,7 +1162,7 @@ void CF_CFDP_R_Tick(CF_Transaction_t *txn) CF_CFDP_GetPrintClass(txn), (unsigned long)txn->history->src_eid, (unsigned long)txn->history->seq_num); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.inactivity_timer; + ++chan->stat.counters.fault.inactivity_timer; CF_CFDP_SetTxnStatus(txn, CF_TxnStatus_INACTIVITY_DETECTED); } diff --git a/fsw/src/cf_cfdp_s.c b/fsw/src/cf_cfdp_s.c index 8ec9040f..75265b83 100644 --- a/fsw/src/cf_cfdp_s.c +++ b/fsw/src/cf_cfdp_s.c @@ -50,9 +50,10 @@ CFE_Status_t CF_CFDP_S_SendFileData(CF_Transaction_t *txn, uint32 foffs, uint32 { int32 status = 0; CFE_Status_t ret; - CF_Logical_PduBuffer_t *ph = CF_CFDP_ConstructPduHeader(txn, + CF_Engine_t *engine_ptr = CF_GetEngine(); + CF_Logical_PduBuffer_t *ph = CF_CFDP_ConstructPduHeader(txn, 0, - CF_AppData.config_table->local_eid, + engine_ptr->config.local_eid, txn->history->peer_eid, 0, txn->history->seq_num, @@ -60,6 +61,7 @@ CFE_Status_t CF_CFDP_S_SendFileData(CF_Transaction_t *txn, uint32 foffs, uint32 CF_Logical_PduFileDataHeader_t *fd; size_t actual_bytes; void *data_ptr; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); if (!ph) { @@ -86,9 +88,9 @@ CFE_Status_t CF_CFDP_S_SendFileData(CF_Transaction_t *txn, uint32 foffs, uint32 { actual_bytes = bytes_to_read; } - if (actual_bytes > CF_AppData.config_table->outgoing_file_chunk_size) + if (actual_bytes > engine_ptr->config.outgoing_file_chunk_size) { - actual_bytes = CF_AppData.config_table->outgoing_file_chunk_size; + actual_bytes = engine_ptr->config.outgoing_file_chunk_size; } /* @@ -118,7 +120,7 @@ CFE_Status_t CF_CFDP_S_SendFileData(CF_Transaction_t *txn, uint32 foffs, uint32 (unsigned long)txn->history->seq_num, (long)foffs, (long)status); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.file_seek; + ++chan->stat.counters.fault.file_seek; ret = CF_ERROR; } else @@ -140,7 +142,7 @@ CFE_Status_t CF_CFDP_S_SendFileData(CF_Transaction_t *txn, uint32 foffs, uint32 (unsigned long)txn->history->seq_num, (long)actual_bytes, (long)status); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.file_read; + ++chan->stat.counters.fault.file_read; ret = CF_ERROR; } else @@ -153,7 +155,7 @@ CFE_Status_t CF_CFDP_S_SendFileData(CF_Transaction_t *txn, uint32 foffs, uint32 { CF_CFDP_SendFd(txn, ph); /* CF_CFDP_SendFd only returns CFE_SUCCESS */ - CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.sent.file_data_bytes += actual_bytes; + chan->stat.counters.sent.file_data_bytes += actual_bytes; if (calc_crc) { CF_CRC_Digest(&txn->crc, fd->data_ptr, fd->data_len); @@ -268,6 +270,7 @@ void CF_CFDP_S2_SubstateNak(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) const CF_Logical_PduNak_t *nak; uint8 counter; uint8 bad_sr; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); bad_sr = 0; @@ -314,8 +317,7 @@ void CF_CFDP_S2_SubstateNak(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) } } - CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.nak_segment_requests += - nak->segment_list.num_segments; + chan->stat.counters.recv.nak_segment_requests += nak->segment_list.num_segments; if (bad_sr) { CFE_EVS_SendEvent(CF_CFDP_S_INVALID_SR_ERR_EID, @@ -335,7 +337,7 @@ void CF_CFDP_S2_SubstateNak(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) CF_CFDP_GetPrintClass(txn), (unsigned long)txn->history->src_eid, (unsigned long)txn->history->seq_num); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.error; + ++chan->stat.counters.recv.error; } } @@ -349,6 +351,7 @@ void CF_CFDP_S2_SubstateEofAck(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph { CFE_Status_t ret; CF_Logical_PduAck_t *ack; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); ret = CF_CFDP_RecvAck(txn, ph); if (ret == CFE_SUCCESS) @@ -375,7 +378,7 @@ void CF_CFDP_S2_SubstateEofAck(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph CF_CFDP_GetPrintClass(txn), (unsigned long)txn->history->src_eid, (unsigned long)txn->history->seq_num); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.error; + ++chan->stat.counters.recv.error; } } @@ -439,8 +442,9 @@ void CF_CFDP_S2_Recv(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) *-----------------------------------------------------------------*/ void CF_CFDP_S_Init(CF_Transaction_t *txn) { - int32 OsStatus; - osal_id_t PendingFd; + int32 OsStatus; + osal_id_t PendingFd; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); PendingFd = OS_OBJECT_ID_UNDEFINED; @@ -458,7 +462,7 @@ void CF_CFDP_S_Init(CF_Transaction_t *txn) (unsigned long)txn->history->src_eid, (unsigned long)txn->history->seq_num, txn->history->fnames.src_filename); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.file_open; + ++chan->stat.counters.fault.file_open; CF_CFDP_SetTxnStatus(txn, CF_TxnStatus_FILESTORE_REJECTION); } } @@ -476,7 +480,7 @@ void CF_CFDP_S_Init(CF_Transaction_t *txn) (unsigned long)txn->history->seq_num, txn->history->fnames.src_filename, (long)OsStatus); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.file_open; + ++chan->stat.counters.fault.file_open; PendingFd = OS_OBJECT_ID_UNDEFINED; /* just in case */ CF_CFDP_SetTxnStatus(txn, CF_TxnStatus_FILESTORE_REJECTION); } @@ -495,7 +499,7 @@ void CF_CFDP_S_Init(CF_Transaction_t *txn) (unsigned long)txn->history->seq_num, txn->history->fnames.src_filename, (long)OsStatus); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.file_seek; + ++chan->stat.counters.fault.file_seek; CF_CFDP_SetTxnStatus(txn, CF_TxnStatus_FILESTORE_REJECTION); } else @@ -517,7 +521,7 @@ void CF_CFDP_S_Init(CF_Transaction_t *txn) (unsigned long)txn->history->seq_num, txn->history->fnames.src_filename, (long)OsStatus); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.file_seek; + ++chan->stat.counters.fault.file_seek; CF_CFDP_SetTxnStatus(txn, CF_TxnStatus_FILESTORE_REJECTION); } } @@ -553,14 +557,14 @@ void CF_CFDP_S_HandleFileRetention(CF_Transaction_t *txn) * the local file deletion policy, either delete directly or move to recycle dir * - If the transfer is not successful or the "keep" flag is true, then do nothing */ - char TempName[CFE_MISSION_MAX_PATH_LEN]; - const char *SubjectFile; - const char *MoveDest; - const CF_ChannelConfig_t *config; - int32 OsStatus; - bool AllowLocalRemove; - - config = &CF_AppData.config_table->chan[txn->chan_num]; + char TempName[CFE_MISSION_MAX_PATH_LEN]; + const char *SubjectFile; + const char *MoveDest; + int32 OsStatus; + bool AllowLocalRemove; + CF_Engine_t *engine_ptr = CF_GetEngine(); + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); + SubjectFile = txn->history->fnames.src_filename; MoveDest = NULL; AllowLocalRemove = false; @@ -574,8 +578,7 @@ void CF_CFDP_S_HandleFileRetention(CF_Transaction_t *txn) * while making it so the automatic transfer will not re-trigger on the same file. */ if (!txn->flags.tx.cmd_tx) { - MoveDest = - CF_CFDP_GetMoveTarget(CF_AppData.config_table->fail_dir, SubjectFile, TempName, sizeof(TempName)); + MoveDest = CF_CFDP_GetMoveTarget(engine_ptr->config.fail_dir, SubjectFile, TempName, sizeof(TempName)); } } else if (!txn->keep) @@ -597,7 +600,7 @@ void CF_CFDP_S_HandleFileRetention(CF_Transaction_t *txn) if (AllowLocalRemove) { /* Everything checked out, If move directory is defined attempt move */ - MoveDest = CF_CFDP_GetMoveTarget(config->move_dir, SubjectFile, TempName, sizeof(TempName)); + MoveDest = CF_CFDP_GetMoveTarget(chan->config.move_dir, SubjectFile, TempName, sizeof(TempName)); } } @@ -886,6 +889,7 @@ void CF_CFDP_S_CheckState(CF_Transaction_t *txn) void CF_CFDP_S_Tick(CF_Transaction_t *txn) { CF_CFDP_AckTxnStatus_t CurrStatus; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); CurrStatus = CF_CFDP_GetAckTxnStatus(txn); @@ -911,7 +915,7 @@ void CF_CFDP_S_Tick(CF_Transaction_t *txn) "CF S(%lu:%lu): inactivity timer expired", (unsigned long)txn->history->src_eid, (unsigned long)txn->history->seq_num); - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.inactivity_timer; + ++chan->stat.counters.fault.inactivity_timer; CF_CFDP_SetTxnStatus(txn, CF_TxnStatus_INACTIVITY_DETECTED); } diff --git a/fsw/src/cf_cfdp_sbintf.c b/fsw/src/cf_cfdp_sbintf.c index c60353fa..4a994b79 100644 --- a/fsw/src/cf_cfdp_sbintf.c +++ b/fsw/src/cf_cfdp_sbintf.c @@ -61,29 +61,30 @@ CF_Logical_PduBuffer_t *CF_CFDP_MsgOutGet(const CF_Transaction_t *txn, bool silent) { /* if channel is frozen, do not take message */ - CF_Channel_t *chan = CF_AppData.engine.channels + txn->chan_num; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); bool success = true; CF_Logical_PduBuffer_t *ret; int32 os_status; + CF_Engine_t *engine_ptr = CF_GetEngine(); /* this function should not be called more than once before the message * is sent, so if there's already an outgoing message allocated * then drop and get a new one (not likely) */ ret = NULL; - if (CF_AppData.engine.out.msg) + if (engine_ptr->out.msg) { - CFE_SB_ReleaseMessageBuffer(CF_AppData.engine.out.msg); - CF_AppData.engine.out.msg = NULL; + CFE_SB_ReleaseMessageBuffer(engine_ptr->out.msg); + engine_ptr->out.msg = NULL; } - if (CF_AppData.config_table->chan[txn->chan_num].max_outgoing_messages_per_wakeup - && (chan->outgoing_counter >= CF_AppData.config_table->chan[txn->chan_num].max_outgoing_messages_per_wakeup)) + if (chan->config.max_outgoing_messages_per_wakeup + && (chan->outgoing_counter >= chan->config.max_outgoing_messages_per_wakeup)) { /* no more messages this wakeup allowed */ success = false; } - if (success && !CF_AppData.hk.Payload.channel_hk[txn->chan_num].frozen && !txn->flags.com.suspended) + if (success && !chan->stat.frozen && !txn->flags.com.suspended) { /* first, check if there's room in the pipe for the message we want to build */ if (OS_ObjectIdDefined(chan->sem_id)) @@ -98,11 +99,11 @@ CF_Logical_PduBuffer_t *CF_CFDP_MsgOutGet(const CF_Transaction_t *txn, bool sile /* Allocate message buffer on success */ if (os_status == OS_SUCCESS) { - CF_AppData.engine.out.msg = CFE_SB_AllocateMessageBuffer(offsetof(CF_PduTlmMsg_t, ph) + CF_MAX_PDU_SIZE - + CF_PDU_ENCAPSULATION_EXTRA_TRAILING_BYTES); + engine_ptr->out.msg = CFE_SB_AllocateMessageBuffer(offsetof(CF_PduTlmMsg_t, ph) + CF_MAX_PDU_SIZE + + CF_PDU_ENCAPSULATION_EXTRA_TRAILING_BYTES); } - if (!CF_AppData.engine.out.msg) + if (!engine_ptr->out.msg) { if (!silent && (os_status == OS_SUCCESS)) { @@ -115,14 +116,14 @@ CF_Logical_PduBuffer_t *CF_CFDP_MsgOutGet(const CF_Transaction_t *txn, bool sile if (success) { - CFE_MSG_Init(&CF_AppData.engine.out.msg->Msg, - CFE_SB_ValueToMsgId(CF_AppData.config_table->chan[txn->chan_num].mid_output), + CFE_MSG_Init(&engine_ptr->out.msg->Msg, + CFE_SB_ValueToMsgId(chan->config.mid_output), offsetof(CF_PduTlmMsg_t, ph)); ++chan->outgoing_counter; /* even if max_outgoing_messages_per_wakeup is 0 (unlimited), it's ok to inc this */ /* prepare for encoding - the "tx_pdudata" is what serves as the temporary holding area for content */ - ret = &CF_AppData.engine.out.tx_pdudata; + ret = &engine_ptr->out.tx_pdudata; } } @@ -136,8 +137,8 @@ CF_Logical_PduBuffer_t *CF_CFDP_MsgOutGet(const CF_Transaction_t *txn, bool sile else { /* if returning a buffer, then reset the encoder state to point to the beginning of the encapsulation msg */ - CF_CFDP_EncodeStart(&CF_AppData.engine.out.encode, - CF_AppData.engine.out.msg, + CF_CFDP_EncodeStart(&engine_ptr->out.encode, + engine_ptr->out.msg, ret, offsetof(CF_PduTlmMsg_t, ph), offsetof(CF_PduTlmMsg_t, ph) + CF_MAX_PDU_SIZE); @@ -152,11 +153,12 @@ CF_Logical_PduBuffer_t *CF_CFDP_MsgOutGet(const CF_Transaction_t *txn, bool sile * See description in cf_cfdp_sbintf.h for argument/return detail * *-----------------------------------------------------------------*/ -void CF_CFDP_Send(uint8 chan_num, const CF_Logical_PduBuffer_t *ph) +void CF_CFDP_Send(CF_Channel_t *chan, const CF_Logical_PduBuffer_t *ph) { CFE_MSG_Size_t sb_msgsize; + CF_Engine_t *engine_ptr = CF_GetEngine(); - CF_Assert(chan_num < CF_NUM_CHANNELS); + CF_Assert(chan); /* now handle the SB encapsulation - this should reflect the * length of the entire message, including encapsulation */ @@ -165,13 +167,13 @@ void CF_CFDP_Send(uint8 chan_num, const CF_Logical_PduBuffer_t *ph) sb_msgsize += ph->pdu_header.data_encoded_length; sb_msgsize += CF_PDU_ENCAPSULATION_EXTRA_TRAILING_BYTES; - CFE_MSG_SetSize(&CF_AppData.engine.out.msg->Msg, sb_msgsize); - CFE_MSG_SetMsgTime(&CF_AppData.engine.out.msg->Msg, CFE_TIME_GetTime()); - CFE_SB_TransmitBuffer(CF_AppData.engine.out.msg, true); + CFE_MSG_SetSize(&engine_ptr->out.msg->Msg, sb_msgsize); + CFE_MSG_SetMsgTime(&engine_ptr->out.msg->Msg, CFE_TIME_GetTime()); + CFE_SB_TransmitBuffer(engine_ptr->out.msg, true); - ++CF_AppData.hk.Payload.channel_hk[chan_num].counters.sent.pdu; + ++chan->stat.counters.sent.pdu; - CF_AppData.engine.out.msg = NULL; + engine_ptr->out.msg = NULL; } /*---------------------------------------------------------------- @@ -182,16 +184,16 @@ void CF_CFDP_Send(uint8 chan_num, const CF_Logical_PduBuffer_t *ph) *-----------------------------------------------------------------*/ void CF_CFDP_ReceiveMessage(CF_Channel_t *chan) { - uint32 count = 0; - int32 status; - const int chan_num = (chan - CF_AppData.engine.channels); - CFE_SB_Buffer_t *bufptr; - CFE_MSG_Size_t msg_size; - CFE_MSG_Type_t msg_type; - + uint32 count = 0; + int32 status; + const int chan_num = CF_ChannelSelect_AsInt(CF_GetChannelFromPtr(chan)); /* for perf log */ + CFE_SB_Buffer_t *bufptr; + CFE_MSG_Size_t msg_size; + CFE_MSG_Type_t msg_type; + CF_Engine_t *engine_ptr = CF_GetEngine(); CF_Logical_PduBuffer_t *ph; - for (; count < CF_AppData.config_table->chan[chan_num].rx_max_messages_per_wakeup; ++count) + for (; count < chan->config.rx_max_messages_per_wakeup; ++count) { bufptr = NULL; msg_size = 0; @@ -202,7 +204,7 @@ void CF_CFDP_ReceiveMessage(CF_Channel_t *chan) break; /* no more messages */ } - ph = &CF_AppData.engine.in.rx_pdudata; + ph = &engine_ptr->in.rx_pdudata; CFE_ES_PerfLogEntry(CF_PERF_ID_PDURCVD(chan_num)); CFE_MSG_GetSize(&bufptr->Msg, &msg_size); CFE_MSG_GetType(&bufptr->Msg, &msg_type); @@ -218,11 +220,11 @@ void CF_CFDP_ReceiveMessage(CF_Channel_t *chan) } if (msg_type == CFE_MSG_Type_Tlm) { - CF_CFDP_DecodeStart(&CF_AppData.engine.in.decode, bufptr, ph, offsetof(CF_PduTlmMsg_t, ph), msg_size); + CF_CFDP_DecodeStart(&engine_ptr->in.decode, bufptr, ph, offsetof(CF_PduTlmMsg_t, ph), msg_size); } else { - CF_CFDP_DecodeStart(&CF_AppData.engine.in.decode, bufptr, ph, offsetof(CF_PduCmdMsg_t, ph), msg_size); + CF_CFDP_DecodeStart(&engine_ptr->in.decode, bufptr, ph, offsetof(CF_PduCmdMsg_t, ph), msg_size); } /* Identify and dispatch this PDU */ diff --git a/fsw/src/cf_cfdp_sbintf.h b/fsw/src/cf_cfdp_sbintf.h index ac49e710..489b3003 100644 --- a/fsw/src/cf_cfdp_sbintf.h +++ b/fsw/src/cf_cfdp_sbintf.h @@ -91,11 +91,11 @@ CF_Logical_PduBuffer_t *CF_CFDP_MsgOutGet(const CF_Transaction_t *txn, bool sile * @par Assumptions, External Events, and Notes: * The PDU in the output buffer is ready to transmit. * - * @param chan_num Channel number for statistics/accounting purposes + * @param chan CF channel pointer (must not be NULL) * @param ph Pointer to PDU buffer to send * */ -void CF_CFDP_Send(uint8 chan_num, const CF_Logical_PduBuffer_t *ph); +void CF_CFDP_Send(CF_Channel_t *chan, const CF_Logical_PduBuffer_t *ph); /************************************************************************/ /** @brief Process received message on channel PDU input pipe. diff --git a/fsw/src/cf_cfdp_types.h b/fsw/src/cf_cfdp_types.h index a10fadcb..01fb0f1e 100644 --- a/fsw/src/cf_cfdp_types.h +++ b/fsw/src/cf_cfdp_types.h @@ -170,12 +170,26 @@ typedef enum CF_TxnStatus_MAX = 24 } CF_TxnStatus_t; +/* + * Forward typedef declarations + * + * These are needed as some of these structures that reference + * each other. Typedefs are created early, then the content + * is defined below. + */ +typedef struct CF_Channel CF_Channel_t; +typedef struct CF_Transaction CF_Transaction_t; +typedef struct CF_History CF_History_t; +typedef struct CF_ChunkWrapper CF_ChunkWrapper_t; +typedef struct CF_Playback CF_Playback_t; +typedef struct CF_Poll CF_Poll_t; + /** * @brief CF History entry * * Records CF app operations for future reference */ -typedef struct CF_History +struct CF_History { CF_TxnFilenames_t fnames; /**< \brief file names associated with this history entry */ CF_CListNode_t cl_node; /**< \brief for connection to a CList */ @@ -184,25 +198,25 @@ typedef struct CF_History CF_EntityId_t src_eid; /**< \brief the source eid of the transaction */ CF_EntityId_t peer_eid; /**< \brief peer_eid is always the "other guy", same src_eid for RX */ CF_TransactionSeq_t seq_num; /**< \brief transaction identifier, stays constant for entire transfer */ -} CF_History_t; +}; /** * @brief Wrapper around a CF_ChunkList_t object * * This allows a CF_ChunkList_t to be stored within a CList data storage structure */ -typedef struct CF_ChunkWrapper +struct CF_ChunkWrapper { CF_ChunkList_t chunks; CF_CListNode_t cl_node; -} CF_ChunkWrapper_t; +}; /** * @brief CF Playback entry * * Keeps the state of CF playback requests */ -typedef struct CF_Playback +struct CF_Playback { osal_id_t dir_id; CF_CFDP_Class_t cfdp_class; @@ -216,19 +230,19 @@ typedef struct CF_Playback bool diropen; bool keep; bool counted; -} CF_Playback_t; +}; /** * @brief CF Poll entry * * Keeps the state of CF directory polling */ -typedef struct CF_Poll +struct CF_Poll { CF_Playback_t pb; CF_Timer_t interval_timer; bool timer_set; -} CF_Poll_t; +}; /** * @brief Data that applies to all types of transactions @@ -317,12 +331,13 @@ typedef struct CF_StateData * * This keeps the state of CF file transactions */ -typedef struct CF_Transaction +struct CF_Transaction { CF_TxnState_t state; /**< \brief each engine is commanded to do something, which is the overall state */ CF_History_t *history; /**< \brief weird, holds active filenames and possibly other info */ CF_ChunkWrapper_t *chunks; /**< \brief for gap tracking, only used on class 2 */ + CF_Channel_t *chan_ptr; /**< \brief reference to the CF channel for this transaction */ CF_Timer_t inactivity_timer; /**< \brief set to the overall inactivity timer of a remote */ CF_Timer_t ack_timer; /**< \brief called ack_timer, but is also nak_timer */ @@ -334,7 +349,6 @@ typedef struct CF_Transaction bool reliable_mode; /**< Set true if class 2, false in class 1 */ uint8 keep; - uint8 chan_num; /**< \brief if ever more than one engine, this may need to change to pointer */ uint8 priority; CF_CListNode_t cl_node; @@ -352,7 +366,7 @@ typedef struct CF_Transaction * Please ignore the duplicate declarations of the "all" flags. */ CF_StateFlags_t flags; -} CF_Transaction_t; +}; /** * @brief Identifies the type of timer tick being processed @@ -369,6 +383,67 @@ typedef enum CF_TickState_NUM_TYPES } CF_TickState_t; +/** + * \brief Configuration entry for directory polling + * + * This is a mirror of what came from the configuration table, stored locally in the app global + */ +typedef struct CF_LocalPdConfig +{ + bool enabled; /**< \brief Enabled flag */ + uint8 priority; /**< \brief priority to use when placing transactions on the pending queue */ + + uint32 interval_sec; /**< \brief number of seconds to wait before trying a new directory */ + + CF_CFDP_Class_t cfdp_class; /**< \brief the CFDP class to send */ + CF_EntityId_t dest_eid; /**< \brief destination entity id */ + + char src_dir[OS_MAX_PATH_LEN]; /**< \brief path to source dir */ + char dst_dir[OS_MAX_PATH_LEN]; /**< \brief path to destination dir */ + +} CF_LocalPdConfig_t; + +/** + * \brief Configuration entry for channel config + * + * This is a mirror of what came from the configuration table, stored locally in the app global + */ +typedef struct CF_LocalChanConfig +{ + uint32 max_outgoing_messages_per_wakeup; /**< \brief max number of messages to send per wakeup (0 - unlimited) */ + uint32 rx_max_messages_per_wakeup; /**< \brief max number of rx messages to process per wakeup */ + + uint32 ack_timer_s; /**< \brief Acknowledge timer in seconds */ + uint32 nak_timer_s; /**< \brief Non-acknowledge timer in seconds */ + uint32 inactivity_timer_s; /**< \brief Inactivity timer in seconds */ + + bool dequeue_enabled; /**< \brief if 1, then the channel will make pending transactions active */ + uint8 ack_limit; /**< number of times to retry ACK (for ex, send FIN and wait for fin-ack) */ + uint8 nak_limit; /**< number of times to retry NAK before giving up (resets on a single response */ + + CFE_SB_MsgId_Atom_t mid_input; /**< \brief msgid integer value for incoming messages */ + CFE_SB_MsgId_Atom_t mid_output; /**< \brief msgid integer value for outgoing messages */ + + uint16 pipe_depth_input; /**< \brief depth of pipe to receive incoming PDU */ + + CF_LocalPdConfig_t polldir[CF_MAX_POLLING_DIR_PER_CHAN]; /**< \brief Configuration for polled directories */ + + char sem_name[OS_MAX_API_NAME]; /**< \brief name of throttling semaphore in TO */ + char move_dir[OS_MAX_PATH_LEN]; /**< \brief Move directory if not empty */ +} CF_LocalChanConfig_t; + +/** + * \brief Housekeeping channel data + */ +typedef struct CF_LocalChanStat +{ + CF_HkCounters_t counters; /**< \brief Counters */ + uint16 q_size[CF_QueueIdx_NUM]; /**< \brief Queue sizes */ + uint8 poll_counter; /**< \brief Number of active polling directories */ + uint8 playback_counter; /**< \brief Number of active playback directories */ + bool frozen; /**< \brief Frozen state: 0 == not frozen, else frozen */ +} CF_LocalChanStat_t; + /** * @brief Channel state object * @@ -378,7 +453,7 @@ typedef enum * and poll state, as well as separate addresses on the underlying message * transport (e.g. SB). */ -typedef struct CF_Channel +struct CF_Channel { CF_CListNode_t *qs[CF_QueueIdx_NUM]; CF_CListNode_t *cs[CF_Direction_NUM]; @@ -405,7 +480,9 @@ typedef struct CF_Channel bool tx_blocked; /**< Set true if PDU transmission was blocked due to limits */ -} CF_Channel_t; + CF_LocalChanConfig_t config; + CF_LocalChanStat_t stat; +}; /** * @brief CF engine output state @@ -431,6 +508,21 @@ typedef struct CF_Input CF_Logical_PduBuffer_t rx_pdudata; /**< \brief Rx PDU logical values */ } CF_Input_t; +typedef struct CF_EngineConfig +{ + uint32 ticks_per_second; /**< \brief expected ticks per second to CFDP app */ + uint32 rx_crc_calc_bytes_per_wakeup; /**< \brief max number of bytes per wakeup to calculate + * r2 CRC for recvd file (must be 1024-byte aligned) + */ + + CF_EntityId_t local_eid; /**< \brief the local entity ID of the CF app */ + + uint16 outgoing_file_chunk_size; /**< \brief maximum size of outgoing file data chunk in a PDU. + * Limited by CF_MAX_PDU_SIZE minus the PDU header(s) */ + char tmp_dir[OS_MAX_PATH_LEN]; /**< \brief directory to put temp files */ + char fail_dir[OS_MAX_PATH_LEN]; /**< \brief fail directory */ +} CF_EngineConfig_t; + /** * @brief An engine represents a pairing to a local EID * @@ -443,6 +535,8 @@ typedef struct CF_Engine CF_Output_t out; CF_Input_t in; + CF_EngineConfig_t config; + /* NOTE: could have separate array of transactions as part of channel? */ CF_Transaction_t transactions[CF_NUM_TRANSACTIONS]; CF_History_t histories[CF_NUM_HISTORIES]; diff --git a/fsw/src/cf_cmd.c b/fsw/src/cf_cmd.c index da2b7308..742bee87 100644 --- a/fsw/src/cf_cmd.c +++ b/fsw/src/cf_cmd.c @@ -39,6 +39,66 @@ #include +/* Helper struct for CF_DoChanAction() */ +typedef struct CF_ChanActionContext +{ + CF_ChanAction_Status_t ret; + CF_ChanActionFn_t fn; + void *context; +} CF_ChanActionContext_t; + +/*---------------------------------------------------------------- + * + * Local Helper Function, compatible with CF_ForEachChannel() + * Resets fault counters + * + *-----------------------------------------------------------------*/ +static int32 CF_DoResetFaultCount(CF_Engine_t *engine_ptr, CF_Channel_t *chan, void *arg) +{ + memset(&chan->stat.counters.fault, 0, sizeof(chan->stat.counters.fault)); + return CFE_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Local Helper Function, compatible with CF_ForEachChannel() + * Resets up counters + * + *-----------------------------------------------------------------*/ +static int32 CF_DoResetUpCount(CF_Engine_t *engine_ptr, CF_Channel_t *chan, void *arg) +{ + memset(&chan->stat.counters.recv, 0, sizeof(chan->stat.counters.recv)); + return CFE_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Local Helper Function, compatible with CF_ForEachChannel() + * Resets down counters + * + *-----------------------------------------------------------------*/ +static int32 CF_DoResetDownCount(CF_Engine_t *engine_ptr, CF_Channel_t *chan, void *arg) +{ + memset(&chan->stat.counters.sent, 0, sizeof(chan->stat.counters.sent)); + return CFE_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Local helper function + * Invokes the requested action on a single channel + * compatible with CF_ForEachChannel() + * + *-----------------------------------------------------------------*/ +static int32 CF_DoSingleChannelAction(CF_Engine_t *engine_ptr, CF_Channel_t *chan, void *arg) +{ + CF_ChanActionContext_t *ctxt = arg; + + ctxt->ret |= ctxt->fn(chan, ctxt->context); + + return CFE_SUCCESS; +} + /*---------------------------------------------------------------- * * Application-scope internal function @@ -55,7 +115,7 @@ CFE_Status_t CF_NoopCmd(const CF_NoopCmd_t *msg) CF_REVISION, CF_MISSION_REV); - ++CF_AppData.hk.Payload.counters.cmd; + ++CF_AppData.counters.cmd; return CFE_SUCCESS; } @@ -68,69 +128,59 @@ CFE_Status_t CF_NoopCmd(const CF_NoopCmd_t *msg) *-----------------------------------------------------------------*/ CFE_Status_t CF_ResetCountersCmd(const CF_ResetCountersCmd_t *msg) { - const CF_UnionArgs_Payload_t *data = &msg->Payload; - static const char *names[5] = { "all", "cmd", "fault", "up", "down" }; + const CF_ResetCountersCmd_Payload_t *data = &msg->Payload; + static const char *names[5] = { "all", "cmd", "fault", "up", "down" }; /* 0=all, 1=cmd, 2=fault 3=up 4=down */ - uint8 param = data->byte[0]; - int i; - bool acc = true; + bool acc = true; + CF_Engine_t *engine_ptr = CF_GetEngine(); - if (param > 4) + if (data->ResetType > 4) { CFE_EVS_SendEvent(CF_CMD_RESET_INVALID_ERR_EID, CFE_EVS_EventType_ERROR, "CF: Received RESET COUNTERS command with invalid parameter %d", - param); - ++CF_AppData.hk.Payload.counters.err; + (int)data->ResetType); + ++CF_AppData.counters.err; } else { CFE_EVS_SendEvent(CF_RESET_INF_EID, CFE_EVS_EventType_INFORMATION, "CF: Received RESET COUNTERS command: %s", - names[param]); + names[data->ResetType]); /* if the param is CF_Reset_command, or all counters */ - if ((param == CF_Reset_all) || (param == CF_Reset_command)) + if ((data->ResetType == CF_Reset_all) || (data->ResetType == CF_Reset_command)) { /* command counters */ - memset(&CF_AppData.hk.Payload.counters, 0, sizeof(CF_AppData.hk.Payload.counters)); + memset(&CF_AppData.counters, 0, sizeof(CF_AppData.counters)); acc = false; /* don't increment accept counter on command counter reset */ } /* if the param is CF_Reset_fault, or all counters */ - if ((param == CF_Reset_all) || (param == CF_Reset_fault)) + if ((data->ResetType == CF_Reset_all) || (data->ResetType == CF_Reset_fault)) { /* fault counters */ - for (i = 0; i < CF_NUM_CHANNELS; ++i) - memset(&CF_AppData.hk.Payload.channel_hk[i].counters.fault, - 0, - sizeof(CF_AppData.hk.Payload.channel_hk[i].counters.fault)); + CF_ForEachChannel(engine_ptr, CF_DoResetFaultCount, NULL); } /* if the param is CF_Reset_up, or all counters */ - if ((param == CF_Reset_all) || (param == CF_Reset_up)) + if ((data->ResetType == CF_Reset_all) || (data->ResetType == CF_Reset_up)) { /* up counters */ - for (i = 0; i < CF_NUM_CHANNELS; ++i) - memset(&CF_AppData.hk.Payload.channel_hk[i].counters.recv, - 0, - sizeof(CF_AppData.hk.Payload.channel_hk[i].counters.recv)); + CF_ForEachChannel(engine_ptr, CF_DoResetUpCount, NULL); } /* if the param is CF_Reset_down, or all counters */ - if ((param == CF_Reset_all) || (param == CF_Reset_down)) + if ((data->ResetType == CF_Reset_all) || (data->ResetType == CF_Reset_down)) { /* down counters */ - for (i = 0; i < CF_NUM_CHANNELS; ++i) - memset(&CF_AppData.hk.Payload.channel_hk[i].counters.sent, - 0, - sizeof(CF_AppData.hk.Payload.channel_hk[i].counters.sent)); + CF_ForEachChannel(engine_ptr, CF_DoResetDownCount, NULL); } if (acc) { - ++CF_AppData.hk.Payload.counters.cmd; + ++CF_AppData.counters.cmd; } } @@ -145,46 +195,41 @@ CFE_Status_t CF_ResetCountersCmd(const CF_ResetCountersCmd_t *msg) *-----------------------------------------------------------------*/ CFE_Status_t CF_TxFileCmd(const CF_TxFileCmd_t *msg) { - const CF_TxFile_Payload_t *tx = &msg->Payload; + const CF_TxFile_Payload_t *tx = &msg->Payload; + CF_Channel_t *chan = CF_GetChannelPtr(tx->chan_num); + CFE_Status_t ret; /* * This needs to validate all its inputs. * "keep" should only be 0 or 1 (logical true/false). * For priority and dest_id params, anything is acceptable. */ - if ((tx->cfdp_class != CF_CFDP_CLASS_1 && tx->cfdp_class != CF_CFDP_CLASS_2) || tx->chan_num >= CF_NUM_CHANNELS - || (int)tx->keep > 1) + if (chan == NULL || !CF_IsValidClass(tx->cfdp_class) || (int)tx->keep > 1) { CFE_EVS_SendEvent(CF_CMD_BAD_PARAM_ERR_EID, CFE_EVS_EventType_ERROR, - "CF: bad parameter in CF_TxFileCmd(): chan=%u, class=%u keep=%u", - (unsigned int)tx->chan_num, + "CF: bad parameter in CF_TxFileCmd(): chan=%d, class=%u keep=%u", + CF_ChannelSelect_AsInt(tx->chan_num), (unsigned int)tx->cfdp_class, (unsigned int)tx->keep); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; /* This must return CFE_SUCCESS because the command is done (error counter was incremented, no more events) */ return CFE_SUCCESS; } - if (CF_CFDP_TxFile(tx->src_filename, - tx->dst_filename, - tx->cfdp_class, - tx->keep, - tx->chan_num, - tx->priority, - tx->dest_id) - == CFE_SUCCESS) + ret = CF_CFDP_TxFile(tx->src_filename, tx->dst_filename, tx->cfdp_class, tx->keep, chan, tx->priority, tx->dest_id); + if (ret == CFE_SUCCESS) { CFE_EVS_SendEvent(CF_CMD_TX_FILE_INF_EID, CFE_EVS_EventType_INFORMATION, "CF: file transfer successfully initiated"); - ++CF_AppData.hk.Payload.counters.cmd; + ++CF_AppData.counters.cmd; } else { CFE_EVS_SendEvent(CF_CMD_TX_FILE_ERR_EID, CFE_EVS_EventType_ERROR, "CF: file transfer initiation failed"); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; } return CFE_SUCCESS; @@ -198,48 +243,49 @@ CFE_Status_t CF_TxFileCmd(const CF_TxFileCmd_t *msg) *-----------------------------------------------------------------*/ CFE_Status_t CF_PlaybackDirCmd(const CF_PlaybackDirCmd_t *msg) { - const CF_TxFile_Payload_t *tx = &msg->Payload; + const CF_TxFile_Payload_t *tx = &msg->Payload; + CF_Channel_t *chan = CF_GetChannelPtr(tx->chan_num); + CFE_Status_t ret; /* * This needs to validate all its inputs. * "keep" should only be 0 or 1 (logical true/false). * For priority and dest_id params, anything is acceptable. */ - if ((tx->cfdp_class != CF_CFDP_CLASS_1 && tx->cfdp_class != CF_CFDP_CLASS_2) || tx->chan_num >= CF_NUM_CHANNELS - || (int)tx->keep > 1) + if (chan == NULL || !CF_IsValidClass(tx->cfdp_class) || (int)tx->keep > 1) { CFE_EVS_SendEvent(CF_CMD_BAD_PARAM_ERR_EID, CFE_EVS_EventType_ERROR, "CF: bad parameter in CF_PlaybackDirCmd(): chan=%u, class=%u keep=%u", - (unsigned int)tx->chan_num, + CF_ChannelSelect_AsInt(tx->chan_num), (unsigned int)tx->cfdp_class, (unsigned int)tx->keep); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; /* This must return CFE_SUCCESS because the command is done (error counter was incremented, no more events) */ return CFE_SUCCESS; } - if (CF_CFDP_PlaybackDir(tx->src_filename, - tx->dst_filename, - tx->cfdp_class, - tx->keep, - tx->chan_num, - tx->priority, - tx->dest_id) - == CFE_SUCCESS) + ret = CF_CFDP_PlaybackDir(tx->src_filename, + tx->dst_filename, + tx->cfdp_class, + tx->keep, + chan, + tx->priority, + tx->dest_id); + if (ret == CFE_SUCCESS) { CFE_EVS_SendEvent(CF_CMD_PLAYBACK_DIR_INF_EID, CFE_EVS_EventType_INFORMATION, "CF: directory playback initiation successful"); - ++CF_AppData.hk.Payload.counters.cmd; + ++CF_AppData.counters.cmd; } else { CFE_EVS_SendEvent(CF_CMD_PLAYBACK_DIR_ERR_EID, CFE_EVS_EventType_ERROR, "CF: directory playback initiation failed"); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; } return CFE_SUCCESS; @@ -252,23 +298,26 @@ CFE_Status_t CF_PlaybackDirCmd(const CF_PlaybackDirCmd_t *msg) * *-----------------------------------------------------------------*/ CF_ChanAction_Status_t -CF_DoChanAction(const CF_UnionArgs_Payload_t *data, const char *errstr, CF_ChanActionFn_t fn, void *context) +CF_DoChanAction(CF_ChannelSelect_t chan_select, const char *errstr, CF_ChanActionFn_t fn, void *context) { - int i; - CF_ChanAction_Status_t ret = CF_ChanAction_Status_SUCCESS; + CF_Engine_t *engine_ptr = CF_GetEngine(); + CF_ChanActionContext_t local_ctxt; + + memset(&local_ctxt, 0, sizeof(local_ctxt)); + local_ctxt.fn = fn; + local_ctxt.context = context; /* this function is generic for any ground command that takes a single channel * argument which must be less than CF_NUM_CHANNELS or 255 which is a special * value that means apply command to all channels */ - if (data->byte[0] == CF_ALL_CHANNELS) + if (CF_IsAllChannels(chan_select)) { /* apply to all channels */ - for (i = 0; i < CF_NUM_CHANNELS; ++i) - ret |= fn(i, context); + CF_ForEachChannel(engine_ptr, CF_DoSingleChannelAction, &local_ctxt); } - else if (data->byte[0] < CF_NUM_CHANNELS) + else if (CF_IsValidChannel(chan_select)) { - ret = fn(data->byte[0], context); + CF_DoSingleChannelAction(engine_ptr, CF_GetChannelPtr(chan_select), &local_ctxt); } else { @@ -277,11 +326,11 @@ CF_DoChanAction(const CF_UnionArgs_Payload_t *data, const char *errstr, CF_ChanA CFE_EVS_EventType_ERROR, "CF: %s: channel parameter out of range. received %d", errstr, - data->byte[0]); - ret = CF_ChanAction_Status_ERROR; + CF_ChannelSelect_AsInt(chan_select)); + local_ctxt.ret = CF_ChanAction_Status_ERROR; } - return ret; + return local_ctxt.ret; } /*---------------------------------------------------------------- @@ -290,11 +339,12 @@ CF_DoChanAction(const CF_UnionArgs_Payload_t *data, const char *errstr, CF_ChanA * See description in cf_cmd.h for argument/return detail * *-----------------------------------------------------------------*/ -CF_ChanAction_Status_t CF_DoFreezeThaw(uint8 chan_num, void *arg) +CF_ChanAction_Status_t CF_DoFreezeThaw(CF_Channel_t *chan, void *arg) { - const CF_ChanAction_BoolArg_t *context = arg; + const CF_ChanAction_BoolArg_t *context = arg; + /* no need to bounds check chan_num, done in caller */ - CF_AppData.hk.Payload.channel_hk[chan_num].frozen = context->barg; + chan->stat.frozen = context->barg; return CF_ChanAction_Status_SUCCESS; } @@ -308,15 +358,15 @@ CFE_Status_t CF_FreezeCmd(const CF_FreezeCmd_t *msg) { CF_ChanAction_BoolArg_t barg = { 1 }; /* param is frozen, so 1 means freeze */ - if (CF_ChanAction_Status_IS_SUCCESS(CF_DoChanAction(&msg->Payload, "freeze", CF_DoFreezeThaw, &barg))) + if (CF_ChanAction_Status_IS_SUCCESS(CF_DoChanAction(msg->Payload.ChannelSelect, "freeze", CF_DoFreezeThaw, &barg))) { CFE_EVS_SendEvent(CF_CMD_FREEZE_INF_EID, CFE_EVS_EventType_INFORMATION, "CF: freeze successful"); - ++CF_AppData.hk.Payload.counters.cmd; + ++CF_AppData.counters.cmd; } else { CFE_EVS_SendEvent(CF_CMD_FREEZE_ERR_EID, CFE_EVS_EventType_ERROR, "CF: freeze cmd failed"); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; } return CFE_SUCCESS; @@ -332,15 +382,15 @@ CFE_Status_t CF_ThawCmd(const CF_ThawCmd_t *msg) { CF_ChanAction_BoolArg_t barg = { 0 }; /* param is frozen, so 0 means thawed */ - if (CF_ChanAction_Status_IS_SUCCESS(CF_DoChanAction(&msg->Payload, "thaw", CF_DoFreezeThaw, &barg))) + if (CF_ChanAction_Status_IS_SUCCESS(CF_DoChanAction(msg->Payload.ChannelSelect, "thaw", CF_DoFreezeThaw, &barg))) { CFE_EVS_SendEvent(CF_CMD_THAW_INF_EID, CFE_EVS_EventType_INFORMATION, "CF: thaw successful"); - ++CF_AppData.hk.Payload.counters.cmd; + ++CF_AppData.counters.cmd; } else { CFE_EVS_SendEvent(CF_CMD_THAW_ERR_EID, CFE_EVS_EventType_ERROR, "CF: thaw cmd failed"); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; } return CFE_SUCCESS; @@ -364,7 +414,9 @@ CF_Transaction_t *CF_FindTransactionBySequenceNumberAllChannels(CF_TransactionSe * to suspend, we need to search across all channels for it. */ for (i = 0; i < CF_NUM_CHANNELS; ++i) { - ret = CF_FindTransactionBySequenceNumber(CF_AppData.engine.channels + i, ts, eid); + CF_Channel_t *chan = CF_GetChannelPtr(CF_ChannelSelect_FromInt(i)); + + ret = CF_FindTransactionBySequenceNumber(chan, ts, eid); if (ret) { break; @@ -386,9 +438,10 @@ int32 CF_TsnChanAction(const CF_Transaction_Payload_t *data, void *context) { CF_Transaction_t *txn; + CF_Channel_t *chan; int32 ret = -1; - if (data->chan == CF_COMPOUND_KEY) + if (CF_IsCompoundKey(data->chan_num)) { /* special value 254 means to use the compound key (data->eid, data->ts) to find the transaction * to act upon */ @@ -408,23 +461,27 @@ int32 CF_TsnChanAction(const CF_Transaction_Payload_t *data, (unsigned long)data->ts); } } - else if (data->chan == CF_ALL_CHANNELS) + else if (CF_IsAllChannels(data->chan_num)) { /* perform action on all channels, all transactions */ ret = CF_TraverseAllTransactions_All_Channels(fn, context); } - else if (data->chan < CF_NUM_CHANNELS) - { - /* perform action on a specific channel, all transactions */ - ret = CF_TraverseAllTransactions(CF_AppData.engine.channels + data->chan, fn, context); - } else { - CFE_EVS_SendEvent(CF_CMD_TSN_CHAN_INVALID_ERR_EID, - CFE_EVS_EventType_ERROR, - "CF: %s cmd: invalid channel %d", - cmdstr, - data->chan); + chan = CF_GetChannelPtr(data->chan_num); + if (chan != NULL) + { + /* perform action on a specific channel, all transactions */ + ret = CF_TraverseAllTransactions(chan, fn, context); + } + else + { + CFE_EVS_SendEvent(CF_CMD_TSN_CHAN_INVALID_ERR_EID, + CFE_EVS_EventType_ERROR, + "CF: %s cmd: invalid channel %d", + cmdstr, + CF_ChannelSelect_AsInt(data->chan_num)); + } } return ret; @@ -476,7 +533,7 @@ void CF_DoSuspRes(const CF_Transaction_Payload_t *payload, uint8 action) "CF: %s cmd: setting suspend flag to current value of %d", msgstr[action], action); - ++CF_AppData.hk.Payload.counters.cmd; + ++CF_AppData.counters.cmd; } else if (ret <= 0) { @@ -485,7 +542,7 @@ void CF_DoSuspRes(const CF_Transaction_Payload_t *payload, uint8 action) CFE_EVS_EventType_ERROR, "CF: %s cmd: no transaction found", msgstr[action]); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; } else { @@ -494,7 +551,7 @@ void CF_DoSuspRes(const CF_Transaction_Payload_t *payload, uint8 action) "CF: %s cmd: setting suspend flag to %d", msgstr[action], action); - ++CF_AppData.hk.Payload.counters.cmd; + ++CF_AppData.counters.cmd; } } @@ -546,13 +603,13 @@ CFE_Status_t CF_CancelCmd(const CF_CancelCmd_t *msg) CFE_EVS_SendEvent(CF_CMD_CANCEL_INF_EID, CFE_EVS_EventType_INFORMATION, "CF: cancel transaction successfully initiated"); - ++CF_AppData.hk.Payload.counters.cmd; + ++CF_AppData.counters.cmd; } else { /* No transaction was matched for the given combination of chan + eid + ts */ CFE_EVS_SendEvent(CF_CMD_CANCEL_CHAN_ERR_EID, CFE_EVS_EventType_ERROR, "CF: cancel cmd: no transaction found"); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; } return CFE_SUCCESS; @@ -580,7 +637,7 @@ CFE_Status_t CF_AbandonCmd(const CF_AbandonCmd_t *msg) if (CF_TsnChanAction(&msg->Payload, "abandon", CF_Abandon_TxnCmd, NULL) > 0) { CFE_EVS_SendEvent(CF_CMD_ABANDON_INF_EID, CFE_EVS_EventType_INFORMATION, "CF: abandon successful"); - ++CF_AppData.hk.Payload.counters.cmd; + ++CF_AppData.counters.cmd; } else { @@ -588,7 +645,7 @@ CFE_Status_t CF_AbandonCmd(const CF_AbandonCmd_t *msg) CFE_EVS_SendEvent(CF_CMD_ABANDON_CHAN_ERR_EID, CFE_EVS_EventType_ERROR, "CF: abandon cmd: no transaction found"); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; } return CFE_SUCCESS; @@ -600,11 +657,12 @@ CFE_Status_t CF_AbandonCmd(const CF_AbandonCmd_t *msg) * See description in cf_cmd.h for argument/return detail * *-----------------------------------------------------------------*/ -CF_ChanAction_Status_t CF_DoEnableDisableDequeue(uint8 chan_num, void *arg) +CF_ChanAction_Status_t CF_DoEnableDisableDequeue(CF_Channel_t *chan, void *arg) { - const CF_ChanAction_BoolArg_t *context = arg; + const CF_ChanAction_BoolArg_t *context = arg; + /* no need to bounds check chan_num, done in caller */ - CF_AppData.config_table->chan[chan_num].dequeue_enabled = context->barg; + chan->config.dequeue_enabled = context->barg; return CF_ChanAction_Status_SUCCESS; } @@ -619,15 +677,15 @@ CFE_Status_t CF_EnableDequeueCmd(const CF_EnableDequeueCmd_t *msg) CF_ChanAction_BoolArg_t barg = { 1 }; if (CF_ChanAction_Status_IS_SUCCESS( - CF_DoChanAction(&msg->Payload, "enable_dequeue", CF_DoEnableDisableDequeue, &barg))) + CF_DoChanAction(msg->Payload.ChannelSelect, "enable_dequeue", CF_DoEnableDisableDequeue, &barg))) { CFE_EVS_SendEvent(CF_CMD_ENABLE_DEQUEUE_INF_EID, CFE_EVS_EventType_INFORMATION, "CF: dequeue enabled"); - ++CF_AppData.hk.Payload.counters.cmd; + ++CF_AppData.counters.cmd; } else { CFE_EVS_SendEvent(CF_CMD_ENABLE_DEQUEUE_ERR_EID, CFE_EVS_EventType_ERROR, "CF: enable dequeue cmd failed"); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; } return CFE_SUCCESS; @@ -644,15 +702,15 @@ CFE_Status_t CF_DisableDequeueCmd(const CF_DisableDequeueCmd_t *msg) CF_ChanAction_BoolArg_t barg = { 0 }; if (CF_ChanAction_Status_IS_SUCCESS( - CF_DoChanAction(&msg->Payload, "disable_dequeue", CF_DoEnableDisableDequeue, &barg))) + CF_DoChanAction(msg->Payload.ChannelSelect, "disable_dequeue", CF_DoEnableDisableDequeue, &barg))) { CFE_EVS_SendEvent(CF_CMD_DISABLE_DEQUEUE_INF_EID, CFE_EVS_EventType_INFORMATION, "CF: dequeue disabled"); - ++CF_AppData.hk.Payload.counters.cmd; + ++CF_AppData.counters.cmd; } else { CFE_EVS_SendEvent(CF_CMD_DISABLE_DEQUEUE_ERR_EID, CFE_EVS_EventType_ERROR, "CF: disable dequeue cmd failed"); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; } return CFE_SUCCESS; @@ -664,29 +722,35 @@ CFE_Status_t CF_DisableDequeueCmd(const CF_DisableDequeueCmd_t *msg) * See description in cf_cmd.h for argument/return detail * *-----------------------------------------------------------------*/ -CF_ChanAction_Status_t CF_DoEnableDisablePolldir(uint8 chan_num, void *arg) +CF_ChanAction_Status_t CF_DoEnableDisablePolldir(CF_Channel_t *chan, void *arg) { int i; - const CF_ChanAction_BoolMsgArg_t *context = arg; - CF_ChanAction_Status_t ret = CF_ChanAction_Status_SUCCESS; + const CF_ChanAction_BoolMsgArg_t *context; + const CF_PollDirSelect_Payload_t *payload; + CF_ChanAction_Status_t ret; + + context = arg; + payload = context->opaque_data; + ret = CF_ChanAction_Status_SUCCESS; + /* no need to bounds check chan_num, done in caller */ - if (context->data->byte[1] == CF_ALL_POLLDIRS) + if (payload->PollDirIndx == CF_ALL_POLLDIRS) { /* all polldirs in channel */ for (i = 0; i < CF_MAX_POLLING_DIR_PER_CHAN; ++i) - CF_AppData.config_table->chan[chan_num].polldir[i].enabled = context->barg; + chan->config.polldir[i].enabled = context->barg; } - else if (context->data->byte[1] < CF_MAX_POLLING_DIR_PER_CHAN) + else if (payload->PollDirIndx < CF_MAX_POLLING_DIR_PER_CHAN) { - CF_AppData.config_table->chan[chan_num].polldir[context->data->byte[1]].enabled = context->barg; + chan->config.polldir[payload->PollDirIndx].enabled = context->barg; } else { CFE_EVS_SendEvent(CF_CMD_POLLDIR_INVALID_ERR_EID, CFE_EVS_EventType_ERROR, "CF: enable/disable polldir: invalid polldir %d on channel %d", - context->data->byte[1], - chan_num); + (int)payload->PollDirIndx, + CF_ChannelSelect_AsInt(CF_GetChannelFromPtr(chan))); ret = CF_ChanAction_Status_ERROR; } @@ -704,19 +768,19 @@ CFE_Status_t CF_EnableDirPollingCmd(const CF_EnableDirPollingCmd_t *msg) CF_ChanAction_BoolMsgArg_t barg = { &msg->Payload, 1 }; if (CF_ChanAction_Status_IS_SUCCESS( - CF_DoChanAction(&msg->Payload, "enable_polldir", CF_DoEnableDisablePolldir, &barg))) + CF_DoChanAction(msg->Payload.ChannelSelect, "enable_polldir", CF_DoEnableDisablePolldir, &barg))) { CFE_EVS_SendEvent(CF_CMD_ENABLE_POLLDIR_INF_EID, CFE_EVS_EventType_INFORMATION, "CF: enabled polling directory"); - ++CF_AppData.hk.Payload.counters.cmd; + ++CF_AppData.counters.cmd; } else { CFE_EVS_SendEvent(CF_CMD_ENABLE_POLLDIR_ERR_EID, CFE_EVS_EventType_ERROR, "CF: enable polling directory cmd failed"); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; } return CFE_SUCCESS; @@ -733,19 +797,19 @@ CFE_Status_t CF_DisableDirPollingCmd(const CF_DisableDirPollingCmd_t *msg) CF_ChanAction_BoolMsgArg_t barg = { &msg->Payload, 0 }; if (CF_ChanAction_Status_IS_SUCCESS( - CF_DoChanAction(&msg->Payload, "disable_polldir", CF_DoEnableDisablePolldir, &barg))) + CF_DoChanAction(msg->Payload.ChannelSelect, "disable_polldir", CF_DoEnableDisablePolldir, &barg))) { CFE_EVS_SendEvent(CF_CMD_DISABLE_POLLDIR_INF_EID, CFE_EVS_EventType_INFORMATION, "CF: disabled polling directory"); - ++CF_AppData.hk.Payload.counters.cmd; + ++CF_AppData.counters.cmd; } else { CFE_EVS_SendEvent(CF_CMD_DISABLE_POLLDIR_ERR_EID, CFE_EVS_EventType_ERROR, "CF: disable polling directory cmd failed"); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; } return CFE_SUCCESS; @@ -784,27 +848,30 @@ CF_CListTraverse_Status_t CF_PurgeTransaction(CF_CListNode_t *node, void *ignore * See description in cf_cmd.h for argument/return detail * *-----------------------------------------------------------------*/ -CF_ChanAction_Status_t CF_DoPurgeQueue(uint8 chan_num, void *arg) +CF_ChanAction_Status_t CF_DoPurgeQueue(CF_Channel_t *chan, void *arg) { - CF_ChanAction_Status_t ret = CF_ChanAction_Status_SUCCESS; - /* no need to bounds check chan_num, done in caller */ - CF_Channel_t *chan = &CF_AppData.engine.channels[chan_num]; - const CF_UnionArgs_Payload_t *data = ((CF_ChanAction_MsgArg_t *)arg)->data; + CF_ChanAction_Status_t ret; + const CF_ChanAction_MsgArg_t *context; + const CF_QueueSelect_Payload_t *payload; bool pend = false; bool hist = false; - switch (data->byte[1]) + context = arg; + payload = context->opaque_data; + ret = CF_ChanAction_Status_SUCCESS; + + switch (payload->QueueSelect) { - case 0: /* pend */ + case CF_QueueSelect_Pending: pend = true; break; - case 1: /* history */ + case CF_QueueSelect_History: hist = true; break; - case 2: /* both */ + case CF_QueueSelect_All: pend = true; hist = true; break; @@ -813,7 +880,7 @@ CF_ChanAction_Status_t CF_DoPurgeQueue(uint8 chan_num, void *arg) CFE_EVS_SendEvent(CF_CMD_PURGE_ARG_ERR_EID, CFE_EVS_EventType_ERROR, "CF: purge queue invalid arg %d", - data->byte[1]); + (int)payload->QueueSelect); ret = CF_ChanAction_Status_ERROR; break; } @@ -840,15 +907,19 @@ CF_ChanAction_Status_t CF_DoPurgeQueue(uint8 chan_num, void *arg) CFE_Status_t CF_PurgeQueueCmd(const CF_PurgeQueueCmd_t *msg) { CF_ChanAction_MsgArg_t arg = { &msg->Payload }; - if (CF_ChanAction_Status_IS_SUCCESS(CF_DoChanAction(&msg->Payload, "purge_queue", CF_DoPurgeQueue, &arg))) + CF_ChanAction_Status_t status; + + status = CF_DoChanAction(msg->Payload.ChannelSelect, "purge_queue", CF_DoPurgeQueue, &arg); + + if (CF_ChanAction_Status_IS_SUCCESS(status)) { CFE_EVS_SendEvent(CF_CMD_PURGE_QUEUE_INF_EID, CFE_EVS_EventType_INFORMATION, "CF: queue purged"); - ++CF_AppData.hk.Payload.counters.cmd; + ++CF_AppData.counters.cmd; } else { CFE_EVS_SendEvent(CF_CMD_PURGE_QUEUE_ERR_EID, CFE_EVS_EventType_ERROR, "CF: purge queue cmd failed"); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; } return CFE_SUCCESS; @@ -864,25 +935,25 @@ CFE_Status_t CF_WriteQueueCmd(const CF_WriteQueueCmd_t *msg) { const CF_WriteQueue_Payload_t *wq = &msg->Payload; - CF_Channel_t *chan = &CF_AppData.engine.channels[wq->chan]; + CF_Channel_t *chan = CF_GetChannelPtr(wq->chan); osal_id_t fd = OS_OBJECT_ID_UNDEFINED; bool success = true; int32 ret; /* check the commands for validity */ - if (wq->chan >= CF_NUM_CHANNELS) + if (chan == NULL) { CFE_EVS_SendEvent(CF_CMD_WQ_CHAN_ERR_EID, CFE_EVS_EventType_ERROR, "CF: write queue invalid channel arg"); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; success = false; } /* only invalid combination is up direction, pending queue */ - else if ((wq->type == CF_Type_up) && (wq->queue == CF_Queue_pend)) + else if ((wq->type == CF_Type_up) && (wq->queue == CF_QueueSelect_Pending)) { CFE_EVS_SendEvent(CF_CMD_WQ_ARGS_ERR_EID, CFE_EVS_EventType_ERROR, "CF: write queue invalid command parameters"); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; success = false; } else @@ -896,7 +967,7 @@ CFE_Status_t CF_WriteQueueCmd(const CF_WriteQueueCmd_t *msg) CFE_EVS_EventType_ERROR, "CF: write queue failed to open file %s", wq->filename); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; success = false; } } @@ -905,7 +976,7 @@ CFE_Status_t CF_WriteQueueCmd(const CF_WriteQueueCmd_t *msg) if (success && ((wq->type == CF_Type_all) || (wq->type == CF_Type_up))) { /* process uplink queue data */ - if ((wq->queue == CF_Queue_all) || (wq->queue == CF_Queue_active)) + if ((wq->queue == CF_QueueSelect_All) || (wq->queue == CF_QueueSelect_Active)) { ret = CF_WriteTxnQueueDataToFile(fd, chan, CF_QueueIdx_RX); if (ret) @@ -914,12 +985,12 @@ CFE_Status_t CF_WriteQueueCmd(const CF_WriteQueueCmd_t *msg) CFE_EVS_EventType_ERROR, "CF: write queue failed to write CF_QueueIdx_RX data"); CF_WrappedClose(fd); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; success = false; } } - if (success && ((wq->queue == CF_Queue_all) || (wq->queue == CF_Queue_history))) + if (success && ((wq->queue == CF_QueueSelect_All) || (wq->queue == CF_QueueSelect_History))) { ret = CF_WriteHistoryQueueDataToFile(fd, chan, CF_Direction_RX); if (ret) @@ -928,7 +999,7 @@ CFE_Status_t CF_WriteQueueCmd(const CF_WriteQueueCmd_t *msg) CFE_EVS_EventType_ERROR, "CF: write queue failed to write history RX data"); CF_WrappedClose(fd); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; success = false; } } @@ -938,7 +1009,7 @@ CFE_Status_t CF_WriteQueueCmd(const CF_WriteQueueCmd_t *msg) if (success && ((wq->type == CF_Type_all) || (wq->type == CF_Type_down))) { /* process downlink queue data */ - if ((wq->queue == CF_Queue_all) || (wq->queue == CF_Queue_active)) + if ((wq->queue == CF_QueueSelect_All) || (wq->queue == CF_QueueSelect_Active)) { ret = CF_WriteTxnQueueDataToFile(fd, chan, CF_QueueIdx_TX); if (ret) @@ -947,12 +1018,12 @@ CFE_Status_t CF_WriteQueueCmd(const CF_WriteQueueCmd_t *msg) CFE_EVS_EventType_ERROR, "CF: write queue failed to write CF_QueueIdx_TX data"); CF_WrappedClose(fd); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; success = false; } } - if (success && ((wq->queue == CF_Queue_all) || (wq->queue == CF_Queue_pend))) + if (success && ((wq->queue == CF_QueueSelect_All) || (wq->queue == CF_QueueSelect_Pending))) { /* write pending queue */ ret = CF_WriteTxnQueueDataToFile(fd, chan, CF_QueueIdx_PEND); @@ -962,12 +1033,12 @@ CFE_Status_t CF_WriteQueueCmd(const CF_WriteQueueCmd_t *msg) CFE_EVS_EventType_ERROR, "CF: write queue failed to write pending queue"); CF_WrappedClose(fd); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; success = false; } } - if (success && ((wq->queue == CF_Queue_all) || (wq->queue == CF_Queue_history))) + if (success && ((wq->queue == CF_QueueSelect_All) || (wq->queue == CF_QueueSelect_History))) { /* write history queue */ ret = CF_WriteHistoryQueueDataToFile(fd, chan, CF_Direction_TX); @@ -977,7 +1048,7 @@ CFE_Status_t CF_WriteQueueCmd(const CF_WriteQueueCmd_t *msg) CFE_EVS_EventType_ERROR, "CF: write queue failed to write CF_QueueIdx_TX data"); CF_WrappedClose(fd); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; success = false; } } @@ -986,7 +1057,7 @@ CFE_Status_t CF_WriteQueueCmd(const CF_WriteQueueCmd_t *msg) if (success) { CFE_EVS_SendEvent(CF_CMD_WQ_INF_EID, CFE_EVS_EventType_INFORMATION, "CF: write queue successful"); - ++CF_AppData.hk.Payload.counters.cmd; + ++CF_AppData.counters.cmd; } return CFE_SUCCESS; @@ -998,7 +1069,7 @@ CFE_Status_t CF_WriteQueueCmd(const CF_WriteQueueCmd_t *msg) * See description in cf_cmd.h for argument/return detail * *-----------------------------------------------------------------*/ -CF_ChanAction_Status_t CF_ValidateChunkSizeCmd(CF_ChunkSize_t val, uint8 chan_num /* ignored */) +CF_ChanAction_Status_t CF_ValidateChunkSizeCmd(CF_ChunkSize_t val, CF_Channel_t *chan /* ignored */) { CF_ChanAction_Status_t ret = CF_ChanAction_Status_SUCCESS; if (val > sizeof(CF_CFDP_PduFileDataContent_t)) @@ -1014,11 +1085,11 @@ CF_ChanAction_Status_t CF_ValidateChunkSizeCmd(CF_ChunkSize_t val, uint8 chan_nu * See description in cf_cmd.h for argument/return detail * *-----------------------------------------------------------------*/ -CF_ChanAction_Status_t CF_ValidateMaxOutgoingCmd(uint32 val, uint8 chan_num) +CF_ChanAction_Status_t CF_ValidateMaxOutgoingCmd(uint32 val, CF_Channel_t *chan) { CF_ChanAction_Status_t ret = CF_ChanAction_Status_SUCCESS; - if (!val && !CF_AppData.config_table->chan[chan_num].sem_name[0]) + if (!val && !chan->config.sem_name[0]) { /* can't have unlimited messages and no semaphore */ ret = CF_ChanAction_Status_ERROR; /* failed */ @@ -1033,64 +1104,75 @@ CF_ChanAction_Status_t CF_ValidateMaxOutgoingCmd(uint32 val, uint8 chan_num) * See description in cf_cmd.h for argument/return detail * *-----------------------------------------------------------------*/ -void CF_GetSetParamCmd(bool is_set, CF_GetSet_ValueID_t param_id, uint32 value, uint8 chan_num) +void CF_GetSetParamCmd(bool is_set, CF_GetSet_ValueID_t param_id, uint32 value, CF_ChannelSelect_t chan_num) { - CF_ConfigTable_t *config; - CFE_Status_t status = CF_ERROR; - bool valid_set; + CFE_Status_t status = CF_ERROR; + bool valid_set; struct { void *ptr; size_t size; - CF_ChanAction_Status_t (*fn)(uint32, uint8 chan_num); + CF_ChanAction_Status_t (*fn)(uint32, CF_Channel_t *); } item; + CF_Engine_t *engine_ptr = CF_GetEngine(); + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); + + if (chan == NULL) + { + CFE_EVS_SendEvent(CF_CMD_GETSET_CHAN_ERR_EID, + CFE_EVS_EventType_ERROR, + "CF: invalid configuration channel id %d received", + CF_ChannelSelect_AsInt(chan_num)); + ++CF_AppData.counters.err; + return; + } + valid_set = false; - config = CF_AppData.config_table; memset(&item, 0, sizeof(item)); switch (param_id) { case CF_GetSet_ValueID_ticks_per_second: - item.ptr = &config->ticks_per_second; - item.size = sizeof(config->ticks_per_second); + item.ptr = &engine_ptr->config.ticks_per_second; + item.size = sizeof(engine_ptr->config.ticks_per_second); break; case CF_GetSet_ValueID_rx_crc_calc_bytes_per_wakeup: - item.ptr = &config->rx_crc_calc_bytes_per_wakeup; - item.size = sizeof(config->rx_crc_calc_bytes_per_wakeup); + item.ptr = &engine_ptr->config.rx_crc_calc_bytes_per_wakeup; + item.size = sizeof(engine_ptr->config.rx_crc_calc_bytes_per_wakeup); break; case CF_GetSet_ValueID_ack_timer_s: - item.ptr = &config->chan[chan_num].ack_timer_s; - item.size = sizeof(config->chan[chan_num].ack_timer_s); + item.ptr = &chan->config.ack_timer_s; + item.size = sizeof(chan->config.ack_timer_s); break; case CF_GetSet_ValueID_nak_timer_s: - item.ptr = &config->chan[chan_num].nak_timer_s; - item.size = sizeof(config->chan[chan_num].nak_timer_s); + item.ptr = &chan->config.nak_timer_s; + item.size = sizeof(chan->config.nak_timer_s); break; case CF_GetSet_ValueID_inactivity_timer_s: - item.ptr = &config->chan[chan_num].inactivity_timer_s; - item.size = sizeof(config->chan[chan_num].inactivity_timer_s); + item.ptr = &chan->config.inactivity_timer_s; + item.size = sizeof(chan->config.inactivity_timer_s); break; case CF_GetSet_ValueID_outgoing_file_chunk_size: - item.ptr = &config->outgoing_file_chunk_size; - item.size = sizeof(config->outgoing_file_chunk_size); + item.ptr = &engine_ptr->config.outgoing_file_chunk_size; + item.size = sizeof(engine_ptr->config.outgoing_file_chunk_size); item.fn = CF_ValidateChunkSizeCmd; break; case CF_GetSet_ValueID_ack_limit: - item.ptr = &config->chan[chan_num].ack_limit; - item.size = sizeof(config->chan[chan_num].ack_limit); + item.ptr = &chan->config.ack_limit; + item.size = sizeof(chan->config.ack_limit); break; case CF_GetSet_ValueID_nak_limit: - item.ptr = &config->chan[chan_num].nak_limit; - item.size = sizeof(config->chan[chan_num].nak_limit); + item.ptr = &chan->config.nak_limit; + item.size = sizeof(chan->config.nak_limit); break; case CF_GetSet_ValueID_local_eid: - item.ptr = &config->local_eid; - item.size = sizeof(config->local_eid); + item.ptr = &engine_ptr->config.local_eid; + item.size = sizeof(engine_ptr->config.local_eid); break; case CF_GetSet_ValueID_chan_max_outgoing_messages_per_wakeup: - item.ptr = &config->chan[chan_num].max_outgoing_messages_per_wakeup; - item.size = sizeof(config->chan[chan_num].max_outgoing_messages_per_wakeup); + item.ptr = &chan->config.max_outgoing_messages_per_wakeup; + item.size = sizeof(chan->config.max_outgoing_messages_per_wakeup); item.fn = CF_ValidateMaxOutgoingCmd; break; default: @@ -1104,18 +1186,11 @@ void CF_GetSetParamCmd(bool is_set, CF_GetSet_ValueID_t param_id, uint32 value, "CF: invalid configuration parameter id %d received", param_id); } - else if (chan_num >= CF_NUM_CHANNELS) - { - CFE_EVS_SendEvent(CF_CMD_GETSET_CHAN_ERR_EID, - CFE_EVS_EventType_ERROR, - "CF: invalid configuration channel id %d received", - chan_num); - } else if (is_set) { if (item.fn) { - if (CF_ChanAction_Status_IS_SUCCESS(item.fn(value, chan_num))) + if (CF_ChanAction_Status_IS_SUCCESS(item.fn(value, chan))) { valid_set = true; } @@ -1186,11 +1261,11 @@ void CF_GetSetParamCmd(bool is_set, CF_GetSet_ValueID_t param_id, uint32 value, if (status == CFE_SUCCESS) { - ++CF_AppData.hk.Payload.counters.cmd; + ++CF_AppData.counters.cmd; } else { - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; } } @@ -1232,19 +1307,21 @@ CFE_Status_t CF_GetParamCmd(const CF_GetParamCmd_t *msg) *-----------------------------------------------------------------*/ CFE_Status_t CF_EnableEngineCmd(const CF_EnableEngineCmd_t *msg) { - if (!CF_AppData.engine.enabled) + CF_Engine_t *engine_ptr = CF_GetEngine(); + + if (!engine_ptr->enabled) { - if (CF_CFDP_InitEngine() == CFE_SUCCESS) + if (CF_CFDP_InitEngine(engine_ptr) == CFE_SUCCESS) { CFE_EVS_SendEvent(CF_CMD_ENABLE_ENGINE_INF_EID, CFE_EVS_EventType_INFORMATION, "CF: enabled CFDP engine"); - ++CF_AppData.hk.Payload.counters.cmd; + ++CF_AppData.counters.cmd; } else { CFE_EVS_SendEvent(CF_CMD_ENABLE_ENGINE_ERR_EID, CFE_EVS_EventType_ERROR, "CF: failed to re-initialize and enable CFDP engine"); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; } } else @@ -1252,7 +1329,7 @@ CFE_Status_t CF_EnableEngineCmd(const CF_EnableEngineCmd_t *msg) CFE_EVS_SendEvent(CF_CMD_ENG_ALREADY_ENA_INF_EID, CFE_EVS_EventType_INFORMATION, "CF: received enable engine command while engine already enabled"); - ++CF_AppData.hk.Payload.counters.cmd; + ++CF_AppData.counters.cmd; } return CFE_SUCCESS; @@ -1266,7 +1343,9 @@ CFE_Status_t CF_EnableEngineCmd(const CF_EnableEngineCmd_t *msg) *-----------------------------------------------------------------*/ CFE_Status_t CF_DisableEngineCmd(const CF_DisableEngineCmd_t *msg) { - if (CF_AppData.engine.enabled) + CF_Engine_t *engine_ptr = CF_GetEngine(); + + if (engine_ptr->enabled) { CF_CFDP_DisableEngine(); CFE_EVS_SendEvent(CF_CMD_DISABLE_ENGINE_INF_EID, CFE_EVS_EventType_INFORMATION, "CF: disabled CFDP engine"); @@ -1278,7 +1357,35 @@ CFE_Status_t CF_DisableEngineCmd(const CF_DisableEngineCmd_t *msg) "CF: received disable engine command while engine already disabled"); } - ++CF_AppData.hk.Payload.counters.cmd; + ++CF_AppData.counters.cmd; + + return CFE_SUCCESS; +} + +/*---------------------------------------------------------------- + * + * Local helper function + * Obtains HK stats for a single channel within the CFDP engine + * Compatible with CF_ForEachChannel() + * + *-----------------------------------------------------------------*/ +static int32 CF_DoHkStats(CF_Engine_t *engine_ptr, CF_Channel_t *chan, void *arg) +{ + CF_HkChannel_Data_t *out_chan_hk; + CF_HkPacket_t *hk = arg; + const int chan_num = CF_ChannelSelect_AsInt(CF_GetChannelFromPtr(chan)); + int q_idx; + + out_chan_hk = &hk->Payload.channel_hk[chan_num]; + + out_chan_hk->counters = chan->stat.counters; + for (q_idx = 0; q_idx < CF_QueueIdx_NUM; ++q_idx) + { + out_chan_hk->q_size[q_idx] = chan->stat.q_size[q_idx]; + } + out_chan_hk->poll_counter = chan->stat.poll_counter; + out_chan_hk->playback_counter = chan->stat.playback_counter; + out_chan_hk->frozen = chan->stat.frozen; return CFE_SUCCESS; } @@ -1291,11 +1398,23 @@ CFE_Status_t CF_DisableEngineCmd(const CF_DisableEngineCmd_t *msg) *-----------------------------------------------------------------*/ CFE_Status_t CF_SendHkCmd(const CF_SendHkCmd_t *msg) { - CFE_SB_TimeStampMsg(CFE_MSG_PTR(CF_AppData.hk.TelemetryHeader)); - /* return value ignored */ CFE_SB_TransmitMsg(CFE_MSG_PTR(CF_AppData.hk.TelemetryHeader), true); + CF_Engine_t *engine_ptr = CF_GetEngine(); + CFE_SB_Buffer_t *sb_buf; + CF_HkPacket_t *hk; - /* This is also used to check tables */ - CF_CheckTables(); + sb_buf = CFE_SB_AllocateMessageBuffer(sizeof(*hk)); + if (sb_buf) + { + CFE_MSG_Init(&sb_buf->Msg, CFE_SB_ValueToMsgId(CF_HK_TLM_MID), sizeof(*hk)); + + hk = (void *)&sb_buf->Msg; + hk->Payload.counters = CF_AppData.counters; + + CF_ForEachChannel(engine_ptr, CF_DoHkStats, hk); + + /* return value ignored */ + CFE_SB_TransmitBuffer(sb_buf, true); + } return CFE_SUCCESS; } @@ -1312,5 +1431,8 @@ CFE_Status_t CF_WakeupCmd(const CF_WakeupCmd_t *msg) CF_CFDP_CycleEngine(); CFE_ES_PerfLogExit(CF_PERF_ID_CYCLE_ENG); + /* This is also used to check tables */ + CF_CheckTables(); + return CFE_SUCCESS; } diff --git a/fsw/src/cf_cmd.h b/fsw/src/cf_cmd.h index 8be5fe18..d0881722 100644 --- a/fsw/src/cf_cmd.h +++ b/fsw/src/cf_cmd.h @@ -47,10 +47,10 @@ static inline bool CF_ChanAction_Status_IS_SUCCESS(CF_ChanAction_Status_t stat) /** * @brief A callback function for use with CF_DoChanAction() * - * @param chan_num The CF channel number, for statistics purposes + * @param chan The CF channel pointer * @param context Opaque object passed through from initial call */ -typedef CF_ChanAction_Status_t (*CF_ChanActionFn_t)(uint8 chan_num, void *context); +typedef CF_ChanAction_Status_t (*CF_ChanActionFn_t)(CF_Channel_t *chan, void *context); /** * @brief An object to use with channel-scope actions requiring only a boolean argument @@ -86,8 +86,8 @@ typedef struct CF_ChanAction_SuspResArg */ typedef struct CF_ChanAction_BoolMsgArg { - const CF_UnionArgs_Payload_t *data; - bool barg; + const void *opaque_data; + bool barg; } CF_ChanAction_BoolMsgArg_t; /** @@ -97,7 +97,7 @@ typedef struct CF_ChanAction_BoolMsgArg */ typedef struct CF_ChanAction_MsgArg { - const CF_UnionArgs_Payload_t *data; + const void *opaque_data; } CF_ChanAction_MsgArg_t; /************************************************************************/ @@ -199,7 +199,7 @@ CFE_Status_t CF_PlaybackDirCmd(const CF_PlaybackDirCmd_t *msg); * @par Assumptions, External Events, and Notes: * cmd must not be NULL, errstr must not be NULL, fn must be a valid function, context may be NULL. * - * @param data Pointer to payload being processed + * @param chan_select Channel selector value from command (validated within this function) * @param errstr String to be included in the EVS event if command should fail * @param fn Callback action function to invoke for each affected channel * @param context Opaque pointer to pass through to callback (not used in this function) @@ -208,7 +208,7 @@ CFE_Status_t CF_PlaybackDirCmd(const CF_PlaybackDirCmd_t *msg); * @retval CF_ChanAction_Status_ERROR on error */ CF_ChanAction_Status_t -CF_DoChanAction(const CF_UnionArgs_Payload_t *data, const char *errstr, CF_ChanActionFn_t fn, void *context); +CF_DoChanAction(CF_ChannelSelect_t chan_select, const char *errstr, CF_ChanActionFn_t fn, void *context); /************************************************************************/ /** @brief Channel action to set the frozen bit for a channel. @@ -216,12 +216,12 @@ CF_DoChanAction(const CF_UnionArgs_Payload_t *data, const char *errstr, CF_ChanA * @par Assumptions, External Events, and Notes: * context must not be NULL. * - * @param chan_num channel number + * @param chan channel pointer (must not be NULL) * @param arg context pointer to object, must be CF_ChanAction_BoolArg_t* * * @returns Always succeeds, so returns CF_ChanAction_Status_SUCCESS. */ -CF_ChanAction_Status_t CF_DoFreezeThaw(uint8 chan_num, void *arg); +CF_ChanAction_Status_t CF_DoFreezeThaw(CF_Channel_t *chan, void *arg); /************************************************************************/ /** @brief Freeze a channel. @@ -380,13 +380,13 @@ CFE_Status_t CF_AbandonCmd(const CF_AbandonCmd_t *msg); * @par Assumptions, External Events, and Notes: * context must not be NULL. * - * @param chan_num channel number + * @param chan channel pointer (must not be NULL) * @param arg context pointer to object, must be CF_ChanAction_BoolArg_t* * * @returns Always succeeds, so returns CF_ChanAction_Status_SUCCESS. * */ -CF_ChanAction_Status_t CF_DoEnableDisableDequeue(uint8 chan_num, void *arg); +CF_ChanAction_Status_t CF_DoEnableDisableDequeue(CF_Channel_t *chan, void *arg); /************************************************************************/ /** @brief Handle an enable dequeue ground command. @@ -414,14 +414,14 @@ CFE_Status_t CF_DisableDequeueCmd(const CF_DisableDequeueCmd_t *msg); * @par Assumptions, External Events, and Notes: * context must not be NULL. * - * @param chan_num channel number + * @param chan channel pointer (must not be NULL) * @param arg context pointer to object, must be CF_ChanAction_BoolMsgArg_t* * * @returns success/fail status code * @retval CF_ChanAction_Status_SUCCESS if successful * @retval CF_ChanAction_Status_ERROR if failed */ -CF_ChanAction_Status_t CF_DoEnableDisablePolldir(uint8 chan_num, void *arg); +CF_ChanAction_Status_t CF_DoEnableDisablePolldir(CF_Channel_t *chan, void *arg); /************************************************************************/ /** @brief Enable a polling dir ground command. @@ -483,14 +483,14 @@ CF_CListTraverse_Status_t CF_PurgeTransaction(CF_CListNode_t *node, void *ignore * @par Assumptions, External Events, and Notes: * None * - * @param chan_num CF channel number + * @param chan CF channel pointer (must not be NULL) * @param arg Pointer to purge queue command * * @returns integer status code indicating success or failure * @retval CF_ChanAction_Status_SUCCESS if successful * @retval CF_ChanAction_Status_ERROR on error */ -CF_ChanAction_Status_t CF_DoPurgeQueue(uint8 chan_num, void *arg); +CF_ChanAction_Status_t CF_DoPurgeQueue(CF_Channel_t *chan, void *arg); /************************************************************************/ /** @brief Ground command to purge either the history or pending queues. @@ -519,14 +519,14 @@ CFE_Status_t CF_WriteQueueCmd(const CF_WriteQueueCmd_t *msg); * None * * @param val Size of chunk to test - * @param chan_num Ignored by this implementation + * @param chan Ignored by this implementation * * @returns status code indicating if check passed * @retval CF_ChanAction_Status_SUCCESS if successful (val is less than or equal to max PDU) * @retval CF_ChanAction_Status_ERROR if failed (val is greater than max PDU) * */ -CF_ChanAction_Status_t CF_ValidateChunkSizeCmd(CF_ChunkSize_t val, uint8 chan_num); +CF_ChanAction_Status_t CF_ValidateChunkSizeCmd(CF_ChunkSize_t val, CF_Channel_t *chan); /************************************************************************/ /** @brief Checks if the value is within allowable range as outgoing packets per wakeup @@ -535,14 +535,14 @@ CF_ChanAction_Status_t CF_ValidateChunkSizeCmd(CF_ChunkSize_t val, uint8 chan_nu * None * * @param val Number to test - * @param chan_num CF channel number + * @param chan CF channel pointer * * @returns status code indicating if check passed * @retval CF_ChanAction_Status_SUCCESS if successful (val is allowable as max packets per wakeup) * @retval CF_ChanAction_Status_ERROR if failed (val is not allowed) * */ -CF_ChanAction_Status_t CF_ValidateMaxOutgoingCmd(uint32 val, uint8 chan_num); +CF_ChanAction_Status_t CF_ValidateMaxOutgoingCmd(uint32 val, CF_Channel_t *chan); /************************************************************************/ /** @brief Perform a configuration get/set operation. @@ -559,10 +559,10 @@ CF_ChanAction_Status_t CF_ValidateMaxOutgoingCmd(uint32 val, uint8 chan_num); * @param is_set Whether to get (false) or set (true) * @param param_id Parameter ID * @param value Value to get/set - * @param chan_num Channel number to operate on + * @param chan_num Channel selector from original command (Validated within this function) * */ -void CF_GetSetParamCmd(bool is_set, CF_GetSet_ValueID_t param_id, uint32 value, uint8 chan_num); +void CF_GetSetParamCmd(bool is_set, CF_GetSet_ValueID_t param_id, uint32 value, CF_ChannelSelect_t chan_num); /************************************************************************/ /** @brief Ground command to set a configuration parameter. diff --git a/fsw/src/cf_dispatch.c b/fsw/src/cf_dispatch.c index 49e3187a..ed7e0abc 100644 --- a/fsw/src/cf_dispatch.c +++ b/fsw/src/cf_dispatch.c @@ -115,7 +115,7 @@ void CF_ProcessGroundCommand(const CFE_SB_Buffer_t *BufPtr) cmd, expected_lengths[cmd], len); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; } } else @@ -124,7 +124,7 @@ void CF_ProcessGroundCommand(const CFE_SB_Buffer_t *BufPtr) CFE_EVS_EventType_ERROR, "CF: invalid ground command packet cmd_code=0x%02x", cmd); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; } } @@ -170,7 +170,7 @@ void CF_AppPipe(const CFE_SB_Buffer_t *BufPtr) } else { - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; CFE_EVS_SendEvent(CF_MID_ERR_EID, CFE_EVS_EventType_ERROR, "CF: invalid command packet id=0x%lx", diff --git a/fsw/src/cf_eds_dispatch.c b/fsw/src/cf_eds_dispatch.c index f65d293d..8bcb9946 100644 --- a/fsw/src/cf_eds_dispatch.c +++ b/fsw/src/cf_eds_dispatch.c @@ -53,7 +53,7 @@ void CF_AppPipe(const CFE_SB_Buffer_t *BufPtr) if (status != CFE_SUCCESS) { CFE_MSG_GetMsgId(&BufPtr->Msg, &MsgId); - ++CF_AppData.hk.Payload.counters.err; + ++CF_AppData.counters.err; if (status == CFE_STATUS_UNKNOWN_MSG_ID) { diff --git a/fsw/src/cf_timer.c b/fsw/src/cf_timer.c index 4ea2600e..d82b9252 100644 --- a/fsw/src/cf_timer.c +++ b/fsw/src/cf_timer.c @@ -42,7 +42,8 @@ *-----------------------------------------------------------------*/ uint32 CF_Timer_Sec2Ticks(CF_Timer_Seconds_t sec) { - return sec * CF_AppData.config_table->ticks_per_second; + CF_Engine_t *engine_ptr = CF_GetEngine(); + return sec * engine_ptr->config.ticks_per_second; } /*---------------------------------------------------------------- diff --git a/fsw/src/cf_utils.c b/fsw/src/cf_utils.c index fe1267b7..2633522e 100644 --- a/fsw/src/cf_utils.c +++ b/fsw/src/cf_utils.c @@ -34,27 +34,15 @@ #include "cf_assert.h" -/*---------------------------------------------------------------- - * - * Application-scope internal function - * See description in cf_utils.h for argument/return detail - * - *-----------------------------------------------------------------*/ -CF_Channel_t *CF_GetChannelFromTxn(CF_Transaction_t *txn) +/* + * Local type to support CF_DoTraverseAllTransactions + */ +typedef struct { - CF_Channel_t *chan; - - if (txn->chan_num < CF_NUM_CHANNELS) - { - chan = &CF_AppData.engine.channels[txn->chan_num]; - } - else - { - chan = NULL; - } - - return chan; -} + CF_TraverseAllTransactions_fn_t fn; + void *context; + int32 ret; +} CF_TraverseAllTransactions_State_t; /*---------------------------------------------------------------- * @@ -159,6 +147,7 @@ CF_Transaction_t *CF_FindUnusedTransaction(CF_Channel_t *chan, CF_Direction_t di /* notably this state is distinguishable from items still on the free list */ txn->state = CF_TxnState_INIT; txn->history->dir = direction; + txn->chan_ptr = chan; } else { @@ -186,12 +175,14 @@ void CF_ResetHistory(CF_Channel_t *chan, CF_History_t *history) * See description in cf_utils.h for argument/return detail * *-----------------------------------------------------------------*/ -void CF_FreeTransaction(CF_Transaction_t *txn, uint8 chan) +void CF_FreeTransaction(CF_Transaction_t *txn) { + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); + memset(txn, 0, sizeof(*txn)); - txn->chan_num = chan; + txn->chan_ptr = chan; CF_CList_InitNode(&txn->cl_node); - CF_CList_InsertBack_Ex(&CF_AppData.engine.channels[chan], CF_QueueIdx_FREE, &txn->cl_node); + CF_CList_InsertBack_Ex(chan, CF_QueueIdx_FREE, &txn->cl_node); } /*---------------------------------------------------------------- @@ -423,9 +414,9 @@ CF_CListTraverse_Status_t CF_PrioSearch(CF_CListNode_t *node, void *context) void CF_InsertSortPrio(CF_Transaction_t *txn, CF_QueueIdx_t queue) { bool insert_back = false; - CF_Channel_t *chan = &CF_AppData.engine.channels[txn->chan_num]; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); - CF_Assert(txn->chan_num < CF_NUM_CHANNELS); + CF_Assert(chan); /* look for proper position on PEND queue for this transaction. * This is a simple priority sort. */ @@ -487,6 +478,22 @@ int32 CF_TraverseAllTransactions(CF_Channel_t *chan, CF_TraverseAllTransactions_ return args.counter; } +/*---------------------------------------------------------------- + * + * Local helper function + * Invokes CF_TraverseAllTransactions() for a single channel within the CFDP engine + * Compatible with CF_ForEachChannel() + * + *-----------------------------------------------------------------*/ +static int32 CF_DoTraverseAllTransactions(CF_Engine_t *engine_ptr, CF_Channel_t *chan, void *arg) +{ + CF_TraverseAllTransactions_State_t *state = arg; + + state->ret += CF_TraverseAllTransactions(chan, state->fn, state->context); + + return CFE_SUCCESS; +} + /*---------------------------------------------------------------- * * Application-scope internal function @@ -495,11 +502,16 @@ int32 CF_TraverseAllTransactions(CF_Channel_t *chan, CF_TraverseAllTransactions_ *-----------------------------------------------------------------*/ int32 CF_TraverseAllTransactions_All_Channels(CF_TraverseAllTransactions_fn_t fn, void *context) { - int i; - int32 ret = 0; - for (i = 0; i < CF_NUM_CHANNELS; ++i) - ret += CF_TraverseAllTransactions(CF_AppData.engine.channels + i, fn, context); - return ret; + CF_TraverseAllTransactions_State_t state; + + memset(&state, 0, sizeof(state)); + + state.fn = fn; + state.context = context; + + CF_ForEachChannel(CF_GetEngine(), CF_DoTraverseAllTransactions, &state); + + return state.ret; } /*---------------------------------------------------------------- @@ -668,3 +680,25 @@ CF_TxnStatus_t CF_TxnStatus_From_ConditionCode(CF_CFDP_ConditionCode_t cc) /* All CFDP CC values directly correspond to a Transaction Status of the same numeric value */ return (CF_TxnStatus_t)cc; } + +/*---------------------------------------------------------------- + * + * Function: CF_ForEachChannel + * + * Application-scope internal function + * See description in cf_utils.h for argument/return detail + * + *-----------------------------------------------------------------*/ +int32 CF_ForEachChannel(CF_Engine_t *engine_ptr, CF_ChannelFunc_t fn, void *arg) +{ + int32 Result; + int32 i; + + Result = CFE_SUCCESS; + for (i = 0; i < CF_NUM_CHANNELS && Result == CFE_SUCCESS; ++i) + { + Result = fn(engine_ptr, &engine_ptr->channels[i], arg); + } + + return Result; +} diff --git a/fsw/src/cf_utils.h b/fsw/src/cf_utils.h index 937353d4..a2e8c8e7 100644 --- a/fsw/src/cf_utils.h +++ b/fsw/src/cf_utils.h @@ -110,6 +110,28 @@ typedef struct CF_Traverse_PriorityArg uint8 priority; /**< \brief seeking this priority */ } CF_Traverse_PriorityArg_t; +/** @brief Function declaration to use with CF_ForEachChannel() + * + * @returns CFE_SUCCESS if completed successfully, otherwise error code + */ +typedef int32 (*CF_ChannelFunc_t)(CF_Engine_t *, CF_Channel_t *, void *); + +/************************************************************************/ +/** @brief Gets the associated channel struct from a transaction + * + * @par Assumptions, External Events, and Notes: + * txn must not be null, and the chan_num must be set + * + * @param txn Transaction + * + * @returns Pointer to CF_Channel_t struct associated with the transaction + * @retval NULL if reference is invalid + */ +static inline CF_Channel_t *CF_GetChannelFromTxn(const CF_Transaction_t *txn) +{ + return txn->chan_ptr; +} + /* free a transaction from the queue it's on. * NOTE: this leaves the transaction in a bad state, * so it must be followed by placing the transaction on @@ -121,41 +143,46 @@ typedef struct CF_Traverse_PriorityArg * pointing to an invalid node */ static inline void CF_DequeueTransaction(CF_Transaction_t *txn) { - CF_Assert(txn && (txn->chan_num < CF_NUM_CHANNELS)); - CF_CList_Remove(&CF_AppData.engine.channels[txn->chan_num].qs[txn->flags.com.q_index], &txn->cl_node); - CF_Assert(CF_AppData.hk.Payload.channel_hk[txn->chan_num].q_size[txn->flags.com.q_index]); /* sanity check */ - --CF_AppData.hk.Payload.channel_hk[txn->chan_num].q_size[txn->flags.com.q_index]; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); + + CF_Assert(chan->stat.q_size[txn->flags.com.q_index]); /* sanity check */ + + CF_CList_Remove(&chan->qs[txn->flags.com.q_index], &txn->cl_node); + --chan->stat.q_size[txn->flags.com.q_index]; } static inline void CF_MoveTransaction(CF_Transaction_t *txn, CF_QueueIdx_t queue) { - CF_Assert(txn && (txn->chan_num < CF_NUM_CHANNELS)); - CF_CList_Remove(&CF_AppData.engine.channels[txn->chan_num].qs[txn->flags.com.q_index], &txn->cl_node); - CF_Assert(CF_AppData.hk.Payload.channel_hk[txn->chan_num].q_size[txn->flags.com.q_index]); /* sanity check */ - --CF_AppData.hk.Payload.channel_hk[txn->chan_num].q_size[txn->flags.com.q_index]; - CF_CList_InsertBack(&CF_AppData.engine.channels[txn->chan_num].qs[queue], &txn->cl_node); + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); + + CF_Assert(chan->stat.q_size[txn->flags.com.q_index]); /* sanity check */ + + CF_CList_Remove(&chan->qs[txn->flags.com.q_index], &txn->cl_node); + --chan->stat.q_size[txn->flags.com.q_index]; + CF_CList_InsertBack(&chan->qs[queue], &txn->cl_node); txn->flags.com.q_index = queue; - ++CF_AppData.hk.Payload.channel_hk[txn->chan_num].q_size[txn->flags.com.q_index]; + ++chan->stat.q_size[txn->flags.com.q_index]; } static inline void CF_CList_Remove_Ex(CF_Channel_t *chan, CF_QueueIdx_t queueidx, CF_CListNode_t *node) { + CF_Assert(chan->stat.q_size[queueidx]); /* sanity check */ + CF_CList_Remove(&chan->qs[queueidx], node); - CF_Assert(CF_AppData.hk.Payload.channel_hk[chan - CF_AppData.engine.channels].q_size[queueidx]); /* sanity check */ - --CF_AppData.hk.Payload.channel_hk[chan - CF_AppData.engine.channels].q_size[queueidx]; + --chan->stat.q_size[queueidx]; } static inline void CF_CList_InsertAfter_Ex(CF_Channel_t *chan, CF_QueueIdx_t queueidx, CF_CListNode_t *start, CF_CListNode_t *after) { CF_CList_InsertAfter(&chan->qs[queueidx], start, after); - ++CF_AppData.hk.Payload.channel_hk[chan - CF_AppData.engine.channels].q_size[queueidx]; + ++chan->stat.q_size[queueidx]; } static inline void CF_CList_InsertBack_Ex(CF_Channel_t *chan, CF_QueueIdx_t queueidx, CF_CListNode_t *node) { CF_CList_InsertBack(&chan->qs[queueidx], node); - ++CF_AppData.hk.Payload.channel_hk[chan - CF_AppData.engine.channels].q_size[queueidx]; + ++chan->stat.q_size[queueidx]; } /************************************************************************/ @@ -194,9 +221,8 @@ void CF_ResetHistory(CF_Channel_t *chan, CF_History_t *history); * txn must not be NULL. * * @param txn Pointer to the transaction object - * @param chan The channel number which this transaction is associated with */ -void CF_FreeTransaction(CF_Transaction_t *txn, uint8 chan); +void CF_FreeTransaction(CF_Transaction_t *txn); /************************************************************************/ /** @brief Finds an active transaction by sequence number. @@ -526,19 +552,6 @@ static inline bool CF_TxnStatus_IsError(CF_TxnStatus_t txn_stat) return (txn_stat > CF_TxnStatus_NO_ERROR); } -/************************************************************************/ -/** @brief Gets the associated channel struct from a transaction - * - * @par Assumptions, External Events, and Notes: - * txn must not be null, and the chan_num must be set - * - * @param txn Transaction - * - * @returns Pointer to CF_Channel_t struct associated with the transaction - * @retval NULL if checks failed - */ -CF_Channel_t *CF_GetChannelFromTxn(CF_Transaction_t *txn); - /************************************************************************/ /** @brief Gets the head of the chunk list for the given channel + direction * @@ -565,4 +578,17 @@ CF_CListNode_t **CF_GetChunkListHead(CF_Channel_t *chan, uint8 direction); */ CF_CFDP_AckTxnStatus_t CF_CFDP_GetAckTxnStatus(CF_Transaction_t *txn); +/************************************************************************/ +/** @brief Invokes the given function on every channel in the engine + * + * Loops through all channels and calls the function. Stops when any + * of the function calls return non-CFE_SUCCESS. + * + * @param engine_ptr Engine pointer + * @param fn Function to call + * @param arg Opaque arg passed to function + * @returns CFE_SUCCESS if completed successfully, otherwise error code + */ +int32 CF_ForEachChannel(CF_Engine_t *engine_ptr, CF_ChannelFunc_t fn, void *arg); + #endif /* !CF_UTILS_H */ diff --git a/fsw/tables/cf_def_config.c b/fsw/tables/cf_def_config.c index 91d75f06..828d4544 100644 --- a/fsw/tables/cf_def_config.c +++ b/fsw/tables/cf_def_config.c @@ -48,7 +48,7 @@ CF_ConfigTable_t CF_config_table = { /* polling directory 0 */ 5, /* interval seconds */ 25, /* priority */ - CF_CFDP_CLASS_2, /* class to send */ + CF_CFDP_Class_2, /* class to send */ 23, /* destination entity id */ "/cf/poll_dir", /* source directory */ "./poll_dir", /* destination directory */ diff --git a/unit-test/cf_app_tests.c b/unit-test/cf_app_tests.c index 8ba105fa..5e927df3 100644 --- a/unit-test/cf_app_tests.c +++ b/unit-test/cf_app_tests.c @@ -69,20 +69,26 @@ void UT_UpdatedDefaultHandler_CFE_SB_ReceiveBuffer(void *UserO void Test_CF_CheckTables_DoNotReleaseAddressBecauseEngineIsEnabled(void) { + CF_Engine_t *engine_ptr = CF_GetEngine(); + /* Arrange */ - CF_AppData.engine.enabled = true; + engine_ptr->enabled = true; /* Act */ CF_CheckTables(); /* Assert */ - UtAssert_STUB_COUNT(CFE_TBL_ReleaseAddress, 0); + UtAssert_STUB_COUNT(CFE_TBL_Manage, 0); } void Test_CF_CheckTables_CallTo_CFE_TBL_ReleaseAddress_ReturnsNot_CFE_SUCCESS_SendEvent(void) { - void *TablePtr = NULL; + CF_ConfigTable_t ut_config; + void *TablePtr = &ut_config; + + memset(&ut_config, 0, sizeof(ut_config)); + UT_SetDefaultReturnValue(UT_KEY(CFE_TBL_Manage), CFE_TBL_INFO_UPDATED); UT_SetDataBuffer(UT_KEY(CFE_TBL_GetAddress), &TablePtr, sizeof(TablePtr), false); UT_SetDefaultReturnValue(UT_KEY(CFE_TBL_ReleaseAddress), CFE_STATUS_EXTERNAL_RESOURCE_FAIL); @@ -90,60 +96,68 @@ void Test_CF_CheckTables_CallTo_CFE_TBL_ReleaseAddress_ReturnsNot_CFE_SUCCESS_Se CF_CheckTables(); /* Assert */ + UtAssert_STUB_COUNT(CFE_TBL_Manage, 1); + UtAssert_STUB_COUNT(CFE_TBL_GetAddress, 1); UtAssert_STUB_COUNT(CFE_TBL_ReleaseAddress, 1); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); } void Test_CF_CheckTables_CallTo_CFE_TBL_Manage_ReturnsNot_CFE_SUCCESS_SendEvent(void) { - void *TablePtr = NULL; + CF_ConfigTable_t ut_config; + void *TablePtr = &ut_config; + + memset(&ut_config, 0, sizeof(ut_config)); - UT_SetDataBuffer(UT_KEY(CFE_TBL_GetAddress), &TablePtr, sizeof(TablePtr), false); UT_SetDefaultReturnValue(UT_KEY(CFE_TBL_Manage), CFE_STATUS_EXTERNAL_RESOURCE_FAIL); + UT_SetDataBuffer(UT_KEY(CFE_TBL_GetAddress), &TablePtr, sizeof(TablePtr), false); /* Act */ CF_CheckTables(); /* Assert */ - UtAssert_STUB_COUNT(CFE_TBL_ReleaseAddress, 1); + UtAssert_STUB_COUNT(CFE_TBL_GetAddress, 0); + UtAssert_STUB_COUNT(CFE_TBL_ReleaseAddress, 0); UtAssert_STUB_COUNT(CFE_TBL_Manage, 1); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); } void Test_CF_CheckTables_CallTo_CFE_TBL_GetAddress_ReturnsNot_CFE_SUCCESS_Or_CFE_TBL_INFO_UPDATED_SendEvent(void) { + UT_SetDefaultReturnValue(UT_KEY(CFE_TBL_Manage), CFE_TBL_INFO_UPDATED); UT_SetDefaultReturnValue(UT_KEY(CFE_TBL_GetAddress), CFE_STATUS_EXTERNAL_RESOURCE_FAIL); /* Act */ CF_CheckTables(); /* Assert */ - UtAssert_STUB_COUNT(CFE_TBL_ReleaseAddress, 1); + UtAssert_STUB_COUNT(CFE_TBL_ReleaseAddress, 0); UtAssert_STUB_COUNT(CFE_TBL_Manage, 1); UtAssert_STUB_COUNT(CFE_TBL_GetAddress, 1); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); } -void Test_CF_CheckTables_CallTo_CFE_TBL_GetAddress_Returns_CFE_SUCCESS(void) +void Test_CF_CheckTables_CallTo_CFE_TBL_Manage_Returns_CFE_SUCCESS(void) { - void *TablePtr = NULL; - - UT_SetDataBuffer(UT_KEY(CFE_TBL_GetAddress), &TablePtr, sizeof(TablePtr), false); + UT_SetDefaultReturnValue(UT_KEY(CFE_TBL_Manage), CFE_SUCCESS); /* Act */ CF_CheckTables(); /* Assert */ - UtAssert_STUB_COUNT(CFE_TBL_ReleaseAddress, 1); + UtAssert_STUB_COUNT(CFE_TBL_ReleaseAddress, 0); UtAssert_STUB_COUNT(CFE_TBL_Manage, 1); - UtAssert_STUB_COUNT(CFE_TBL_GetAddress, 1); + UtAssert_STUB_COUNT(CFE_TBL_GetAddress, 0); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 0); } -void Test_CF_CheckTables_CallTo_CFE_TBL_GetAddress_Returns_CFE_TBL_INFO_UPDATED(void) +void Test_CF_CheckTables_CallTo_CFE_TBL_Manage_Returns_CFE_TBL_INFO_UPDATED(void) { - void *TablePtr = NULL; + CF_ConfigTable_t ut_config; + void *TablePtr = &ut_config; + memset(&ut_config, 0, sizeof(ut_config)); + UT_SetDefaultReturnValue(UT_KEY(CFE_TBL_Manage), CFE_TBL_INFO_UPDATED); UT_SetDataBuffer(UT_KEY(CFE_TBL_GetAddress), &TablePtr, sizeof(TablePtr), false); UT_SetDefaultReturnValue(UT_KEY(CFE_TBL_GetAddress), CFE_TBL_INFO_UPDATED); @@ -154,6 +168,7 @@ void Test_CF_CheckTables_CallTo_CFE_TBL_GetAddress_Returns_CFE_TBL_INFO_UPDATED( UtAssert_STUB_COUNT(CFE_TBL_ReleaseAddress, 1); UtAssert_STUB_COUNT(CFE_TBL_Manage, 1); UtAssert_STUB_COUNT(CFE_TBL_GetAddress, 1); + UtAssert_STUB_COUNT(CF_ForEachChannel, 1); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 0); } @@ -338,7 +353,10 @@ void Test_CF_TableInit_FailBecause_CFE_TBL_GetAddress_DidNotReturnSuccess(void) void Test_CF_TableInit_When_CFE_TBL_GetAddress_Returns_CFE_SUCCESS_SuccessAndDoNotSendEvent(void) { - void *TablePtr = NULL; + CF_ConfigTable_t ut_config; + void *TablePtr = &ut_config; + + memset(&ut_config, 0, sizeof(ut_config)); UT_SetDataBuffer(UT_KEY(CFE_TBL_GetAddress), &TablePtr, sizeof(TablePtr), false); @@ -351,7 +369,10 @@ void Test_CF_TableInit_When_CFE_TBL_GetAddress_Returns_CFE_SUCCESS_SuccessAndDoN void Test_CF_TableInit_When_CFE_TBL_GetAddress_Returns_CFE_TBL_INFO_UPDATED_SuccessAndDoNotSendEvent(void) { - void *TablePtr = NULL; + CF_ConfigTable_t ut_config; + void *TablePtr = &ut_config; + + memset(&ut_config, 0, sizeof(ut_config)); UT_SetDataBuffer(UT_KEY(CFE_TBL_GetAddress), &TablePtr, sizeof(TablePtr), false); /* Arrange */ @@ -380,7 +401,6 @@ void Test_CF_AppInit_CallTo_CFE_EVS_Register_ReturnsNot_CFE_SUCCESS_Call_CFE_ES_ UtAssert_INT32_EQ(CF_AppInit(), result); /* Assert */ - UtAssert_STUB_COUNT(CFE_MSG_Init, 1); UtAssert_STUB_COUNT(CFE_EVS_Register, 1); UtAssert_STUB_COUNT(CFE_ES_WriteToSysLog, 1); } @@ -396,7 +416,6 @@ void Test_CF_AppInit_CallTo_CFE_SB_CreatePipe_ReturnsNot_CFE_SUCCESS_Return_Pipe UtAssert_INT32_EQ(CF_AppInit(), result); /* Assert */ - UtAssert_STUB_COUNT(CFE_MSG_Init, 1); UtAssert_STUB_COUNT(CFE_EVS_Register, 1); UtAssert_STUB_COUNT(CFE_SB_CreatePipe, 1); UT_CF_AssertEventID(CF_CR_PIPE_ERR_EID); @@ -414,7 +433,6 @@ void Test_CF_AppInit_FirstCallTo_CFE_SB_Subscribe_ReturnsNot_CFE_SUCCESS_Call_CF UtAssert_INT32_EQ(CF_AppInit(), result); /* Assert */ - UtAssert_STUB_COUNT(CFE_MSG_Init, 1); UtAssert_STUB_COUNT(CFE_EVS_Register, 1); UtAssert_STUB_COUNT(CFE_SB_CreatePipe, 1); UtAssert_STUB_COUNT(CFE_SB_Subscribe, 1); @@ -435,7 +453,6 @@ void Test_CF_AppInit_CallTo_CF_TableInit_ReturnsNot_CFE_SUCCESS_ReturnErrorStatu UtAssert_INT32_EQ(CF_AppInit(), result); /* Assert */ - UtAssert_STUB_COUNT(CFE_MSG_Init, 1); UtAssert_STUB_COUNT(CFE_EVS_Register, 1); UtAssert_STUB_COUNT(CFE_SB_CreatePipe, 1); UtAssert_STUB_COUNT(CFE_SB_Subscribe, 3); @@ -445,8 +462,11 @@ void Test_CF_AppInit_CallTo_CF_TableInit_ReturnsNot_CFE_SUCCESS_ReturnErrorStatu void Test_CF_AppInit_CallTo_CF_CFDP_InitEngine_ReturnsNot_CFE_SUCCESS_ReturnErrorStatus(void) { /* Arrange */ - int32 result = -1; - void *TablePtr = NULL; + int32 result = -1; + CF_ConfigTable_t ut_config; + void *TablePtr = &ut_config; + + memset(&ut_config, 0, sizeof(ut_config)); UT_SetDataBuffer(UT_KEY(CFE_TBL_GetAddress), &TablePtr, sizeof(TablePtr), false); UT_SetDefaultReturnValue(UT_KEY(CF_CFDP_InitEngine), result); @@ -455,7 +475,6 @@ void Test_CF_AppInit_CallTo_CF_CFDP_InitEngine_ReturnsNot_CFE_SUCCESS_ReturnErro UtAssert_INT32_EQ(CF_AppInit(), result); /* Assert */ - UtAssert_STUB_COUNT(CFE_MSG_Init, 1); UtAssert_STUB_COUNT(CFE_EVS_Register, 1); UtAssert_STUB_COUNT(CFE_SB_CreatePipe, 1); UtAssert_STUB_COUNT(CFE_SB_Subscribe, 3); @@ -464,7 +483,10 @@ void Test_CF_AppInit_CallTo_CF_CFDP_InitEngine_ReturnsNot_CFE_SUCCESS_ReturnErro void Test_CF_AppInit_Success(void) { - void *TablePtr = NULL; + CF_ConfigTable_t ut_config; + void *TablePtr = &ut_config; + + memset(&ut_config, 0, sizeof(ut_config)); UT_SetDataBuffer(UT_KEY(CFE_TBL_GetAddress), &TablePtr, sizeof(TablePtr), false); @@ -472,7 +494,7 @@ void Test_CF_AppInit_Success(void) UtAssert_INT32_EQ(CF_AppInit(), CFE_SUCCESS); /* Assert */ - UtAssert_STUB_COUNT(CFE_MSG_Init, 1); + UtAssert_STUB_COUNT(CF_CFDP_InitEngine, 1); } /******************************************************************************* @@ -503,8 +525,10 @@ void Test_CF_AppMain_CFE_SB_ReceiveBuffer_Cases(void) { CFE_SB_Buffer_t sbbuf; CFE_SB_Buffer_t *sbbufptr; - void *TablePtr = NULL; + CF_ConfigTable_t ut_config; + void *TablePtr = &ut_config; + memset(&ut_config, 0, sizeof(ut_config)); memset(&sbbuf, 0, sizeof(sbbuf)); /* Run loop once */ @@ -553,8 +577,11 @@ void Test_CF_AppMain_RunLoopCallTo_CFE_SB_ReceiveBuffer_Returns_CFE_SUCCESS_AndV /* Arrange */ CFE_SB_MsgId_t forced_MsgID = CFE_SB_INVALID_MSG_ID; CFE_SB_Buffer_t fake_msg; - CFE_SB_Buffer_t *BufPtr = &fake_msg; - void *TablePtr = NULL; + CFE_SB_Buffer_t *BufPtr = &fake_msg; + CF_ConfigTable_t ut_config; + void *TablePtr = &ut_config; + + memset(&ut_config, 0, sizeof(ut_config)); UT_SetDataBuffer(UT_KEY(CFE_TBL_GetAddress), &TablePtr, sizeof(TablePtr), false); @@ -603,14 +630,14 @@ void add_CF_CheckTables_tests(void) Setup_cf_config_table_tests, CF_App_Tests_Teardown, "Test_CF_CheckTables_CallTo_CFE_TBL_GetAddress_ReturnsNot_CFE_SUCCESS_Or_CFE_TBL_INFO_UPDATED_SendEvent"); - UtTest_Add(Test_CF_CheckTables_CallTo_CFE_TBL_GetAddress_Returns_CFE_SUCCESS, + UtTest_Add(Test_CF_CheckTables_CallTo_CFE_TBL_Manage_Returns_CFE_SUCCESS, Setup_cf_config_table_tests, CF_App_Tests_Teardown, - "Test_CF_CheckTables_CallTo_CFE_TBL_GetAddress_Returns_CFE_SUCCESS"); - UtTest_Add(Test_CF_CheckTables_CallTo_CFE_TBL_GetAddress_Returns_CFE_TBL_INFO_UPDATED, + "Test_CF_CheckTables_CallTo_CFE_TBL_Manage_Returns_CFE_SUCCESS"); + UtTest_Add(Test_CF_CheckTables_CallTo_CFE_TBL_Manage_Returns_CFE_TBL_INFO_UPDATED, Setup_cf_config_table_tests, CF_App_Tests_Teardown, - "Test_CF_CheckTables_CallTo_CFE_TBL_GetAddress_Returns_CFE_TBL_INFO_UPDATED"); + "Test_CF_CheckTables_CallTo_CFE_TBL_Manage_Returns_CFE_TBL_INFO_UPDATED"); } void add_CF_ValidateConfigTable_tests(void) diff --git a/unit-test/cf_cfdp_dispatch_tests.c b/unit-test/cf_cfdp_dispatch_tests.c index 86ff6dd8..9f49941e 100644 --- a/unit-test/cf_cfdp_dispatch_tests.c +++ b/unit-test/cf_cfdp_dispatch_tests.c @@ -33,7 +33,7 @@ static void UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_t setup, CF_Channel_t **channel_p, CF_History_t **history_p, CF_Transaction_t **txn_p, - CF_ConfigTable_t **config_table_p) + CF_EngineConfig_t **config_table_p) { /* * fake objects used to pass into CF app during unit tests. @@ -42,7 +42,9 @@ static void UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_t setup, static CF_Logical_PduBuffer_t ut_pdu_buffer; static CF_History_t ut_history; static CF_Transaction_t ut_transaction; - static CF_ConfigTable_t ut_config_table; + + CF_Engine_t *engine_ptr = CF_GetEngine(); + CF_Channel_t *local_channel_p = &engine_ptr->channels[UT_CFDP_CHANNEL_IDX]; /* * always clear all objects, regardless of what was asked for. @@ -52,12 +54,11 @@ static void UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_t setup, memset(&ut_pdu_buffer, 0, sizeof(ut_pdu_buffer)); memset(&ut_history, 0, sizeof(ut_history)); memset(&ut_transaction, 0, sizeof(ut_transaction)); - memset(&ut_config_table, 0, sizeof(ut_config_table)); /* certain pointers should be connected even if they were not asked for, * as internal code may assume these are set (test cases may un-set) */ ut_transaction.history = &ut_history; - CF_AppData.config_table = &ut_config_table; + ut_transaction.chan_ptr = local_channel_p; if (pdu_buffer_p) { @@ -81,7 +82,7 @@ static void UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_t setup, * a member of that array, so for now it must be so. * This always uses the same channel for now. */ - *channel_p = &CF_AppData.engine.channels[UT_CFDP_CHANNEL]; + *channel_p = local_channel_p; } if (history_p) { @@ -93,7 +94,7 @@ static void UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_t setup, } if (config_table_p) { - *config_table_p = &ut_config_table; + *config_table_p = &engine_ptr->config; } /* reset the event ID capture between each sub-case */ @@ -135,6 +136,7 @@ void Test_CF_CFDP_R_DispatchRecv(void) CF_Logical_PduBuffer_t *ph; CF_CFDP_R_SubstateDispatchTable_t dispatch; CF_CFDP_FileDirectiveDispatchTable_t fddt; + CF_Channel_t *chan; memset(&dispatch, 0, sizeof(dispatch)); memset(&fddt, 0, sizeof(fddt)); @@ -146,38 +148,38 @@ void Test_CF_CFDP_R_DispatchRecv(void) dispatch.state[CF_RxSubState_DATA_EOF] = &fddt; /* nominal (file directive) */ - UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); ph->pdu_header.pdu_type = 0; UtAssert_VOIDCALL(CF_CFDP_R_DispatchRecv(txn, ph, &dispatch, NULL)); /* nominal (file data) */ - UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); ph->pdu_header.pdu_type = 1; UtAssert_VOIDCALL(CF_CFDP_R_DispatchRecv(txn, ph, &dispatch, NULL)); /* directive code beyond range */ - UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); ph->fdirective.directive_code = CF_CFDP_FileDirective_INVALID_MAX; UtAssert_VOIDCALL(CF_CFDP_R_DispatchRecv(txn, ph, &dispatch, NULL)); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.spurious, 1); + UtAssert_UINT32_EQ(chan->stat.counters.recv.spurious, 1); UT_CF_AssertEventID(CF_CFDP_R_DC_INV_ERR_EID); /* file data with error */ - UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); ph->pdu_header.pdu_type = 1; UT_SetDeferredRetcode(UT_KEY(CF_CFDP_TxnIsOK), 1, false); UtAssert_VOIDCALL(CF_CFDP_R_DispatchRecv(txn, ph, &dispatch, NULL)); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.dropped, 1); + UtAssert_UINT32_EQ(chan->stat.counters.recv.dropped, 1); /* test actual dispatch */ - UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); ph->fdirective.directive_code = CF_CFDP_FileDirective_METADATA; txn->state_data.sub_state = CF_RxSubState_DATA_EOF; UtAssert_VOIDCALL(CF_CFDP_R_DispatchRecv(txn, ph, &dispatch, CF_CFDP_R2_Recv)); UtAssert_STUB_COUNT(CF_CFDP_R1_Recv, 1); UtAssert_STUB_COUNT(CF_CFDP_R2_Recv, 0); - UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); ph->pdu_header.pdu_type = 1; txn->state_data.sub_state = CF_RxSubState_DATA_EOF; UtAssert_VOIDCALL(CF_CFDP_R_DispatchRecv(txn, ph, &dispatch, CF_CFDP_R2_Recv)); @@ -195,6 +197,7 @@ void Test_CF_CFDP_S_DispatchRecv(void) CF_Logical_PduBuffer_t *ph; CF_CFDP_S_SubstateRecvDispatchTable_t dispatch; CF_CFDP_FileDirectiveDispatchTable_t fddt; + CF_Channel_t *chan; memset(&dispatch, 0, sizeof(dispatch)); memset(&fddt, 0, sizeof(fddt)); @@ -204,23 +207,23 @@ void Test_CF_CFDP_S_DispatchRecv(void) dispatch.substate[CF_TxSubState_DATA_EOF] = &fddt; /* nominal, no handler */ - UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); UtAssert_VOIDCALL(CF_CFDP_S_DispatchRecv(txn, ph, &dispatch)); /* directive code beyond range */ - UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); ph->fdirective.directive_code = CF_CFDP_FileDirective_INVALID_MAX; UtAssert_VOIDCALL(CF_CFDP_S_DispatchRecv(txn, ph, &dispatch)); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.spurious, 1); + UtAssert_UINT32_EQ(chan->stat.counters.recv.spurious, 1); UT_CF_AssertEventID(CF_CFDP_S_DC_INV_ERR_EID); /* file data PDU, not expected in this type of txn */ - UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); ph->pdu_header.pdu_type = 1; UtAssert_VOIDCALL(CF_CFDP_S_DispatchRecv(txn, ph, &dispatch)); /* test actual dispatch */ - UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); ph->fdirective.directive_code = CF_CFDP_FileDirective_METADATA; txn->state_data.sub_state = CF_TxSubState_DATA_EOF; UtAssert_VOIDCALL(CF_CFDP_S_DispatchRecv(txn, ph, &dispatch)); @@ -236,6 +239,7 @@ void Test_CF_CFDP_RxStateDispatch(void) CF_Transaction_t *txn; CF_Logical_PduBuffer_t *ph; CF_CFDP_TxnRecvDispatchTable_t dispatch; + CF_Channel_t *chan; memset(&dispatch, 0, sizeof(dispatch)); @@ -243,14 +247,14 @@ void Test_CF_CFDP_RxStateDispatch(void) dispatch.rx[CF_TxnState_DROP] = CF_CFDP_RecvDrop; /* nominal, no handler */ - UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); ph->pdu_header.txm_mode = 1; txn->state = CF_TxnState_INIT; txn->reliable_mode = false; UtAssert_VOIDCALL(CF_CFDP_RxStateDispatch(txn, ph, &dispatch)); /* nominal, with handler */ - UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); ph->pdu_header.txm_mode = 1; txn->state = CF_TxnState_R1; txn->reliable_mode = false; @@ -258,14 +262,14 @@ void Test_CF_CFDP_RxStateDispatch(void) UtAssert_STUB_COUNT(CF_CFDP_R1_Recv, 1); /* Got txm_mode = 0 in an R1 */ - UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); ph->pdu_header.txm_mode = 0; txn->reliable_mode = false; UtAssert_VOIDCALL(CF_CFDP_RxStateDispatch(txn, ph, &dispatch)); UtAssert_STUB_COUNT(CF_CFDP_RecvDrop, 1); /* Got txm_mode = 1 in an R2 */ - UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_Dispatch_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); ph->pdu_header.txm_mode = 1; txn->reliable_mode = true; UtAssert_VOIDCALL(CF_CFDP_RxStateDispatch(txn, ph, &dispatch)); diff --git a/unit-test/cf_cfdp_r_tests.c b/unit-test/cf_cfdp_r_tests.c index d4e8a2fd..49b2e1f5 100644 --- a/unit-test/cf_cfdp_r_tests.c +++ b/unit-test/cf_cfdp_r_tests.c @@ -43,7 +43,7 @@ static void UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_t setup, CF_Channel_t **channel_p, CF_History_t **history_p, CF_Transaction_t **txn_p, - CF_ConfigTable_t **config_table_p) + CF_EngineConfig_t **config_table_p) { /* * fake objects used to pass into CF app during unit tests. @@ -52,7 +52,9 @@ static void UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_t setup, static CF_Logical_PduBuffer_t ut_pdu_buffer; static CF_History_t ut_history; static CF_Transaction_t ut_transaction; - static CF_ConfigTable_t ut_config_table; + + CF_Engine_t *engine_ptr = CF_GetEngine(); + CF_Channel_t *local_channel_p = &engine_ptr->channels[UT_CFDP_CHANNEL_IDX]; /* * always clear all objects, regardless of what was asked for. @@ -62,12 +64,11 @@ static void UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_t setup, memset(&ut_pdu_buffer, 0, sizeof(ut_pdu_buffer)); memset(&ut_history, 0, sizeof(ut_history)); memset(&ut_transaction, 0, sizeof(ut_transaction)); - memset(&ut_config_table, 0, sizeof(ut_config_table)); /* certain pointers should be connected even if they were not asked for, * as internal code may assume these are set (test cases may un-set) */ ut_transaction.history = &ut_history; - CF_AppData.config_table = &ut_config_table; + ut_transaction.chan_ptr = local_channel_p; if (pdu_buffer_p) { @@ -91,7 +92,7 @@ static void UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_t setup, * a member of that array, so for now it must be so. * This always uses the same channel for now. */ - *channel_p = &CF_AppData.engine.channels[UT_CFDP_CHANNEL]; + *channel_p = local_channel_p; } if (history_p) { @@ -103,7 +104,7 @@ static void UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_t setup, } if (config_table_p) { - *config_table_p = &ut_config_table; + *config_table_p = &engine_ptr->config; } if (setup == UT_CF_Setup_TX) @@ -372,9 +373,10 @@ void Test_CF_CFDP_R_Init(void) * void CF_CFDP_R_Init(CF_Transaction_t *txn); */ CF_Transaction_t *txn; + CF_Channel_t *chan; /* nominal */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, NULL, &chan, NULL, &txn, NULL); txn->state_data.fin_dc = -1; txn->state_data.fin_fs = -1; UtAssert_VOIDCALL(CF_CFDP_R_Init(txn)); @@ -382,26 +384,26 @@ void Test_CF_CFDP_R_Init(void) UtAssert_UINT8_EQ(txn->state_data.fin_fs, CF_CFDP_FinFileStatus_INVALID); /* nominal, R2 state, creates tempfile */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, NULL, &chan, NULL, &txn, NULL); txn->reliable_mode = true; UtAssert_VOIDCALL(CF_CFDP_R_Init(txn)); UT_CF_AssertEventID(CF_CFDP_R_TEMP_FILE_INF_EID); /* failure of file open, class 1 */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, NULL, &chan, NULL, &txn, NULL); UT_SetDeferredRetcode(UT_KEY(CF_WrappedOpenCreate), 1, -1); txn->reliable_mode = false; UtAssert_VOIDCALL(CF_CFDP_R_Init(txn)); UT_CF_AssertEventID(CF_CFDP_R_CREAT_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.file_open, 1); + UtAssert_UINT32_EQ(chan->stat.counters.fault.file_open, 1); /* failure of file open, class 2 */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, NULL, &chan, NULL, &txn, NULL); UT_SetDeferredRetcode(UT_KEY(CF_WrappedOpenCreate), 1, -1); txn->reliable_mode = true; UtAssert_VOIDCALL(CF_CFDP_R_Init(txn)); UT_CF_AssertEventID(CF_CFDP_R_CREAT_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.file_open, 2); + UtAssert_UINT32_EQ(chan->stat.counters.fault.file_open, 2); UtAssert_INT32_EQ(txn->history->txn_stat, CF_TxnStatus_FILESTORE_REJECTION); } @@ -411,27 +413,28 @@ void Test_CF_CFDP_R_CheckCrc(void) * int CF_CFDP_R_CheckCrc(CF_Transaction_t *txn, uint32 expected_crc); */ CF_Transaction_t *txn; + CF_Channel_t *chan; /* CRC mismatch, class 1 */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, NULL, &chan, NULL, &txn, NULL); txn->reliable_mode = false; txn->crc.result = 0xdeadbeef; txn->state_data.eof_crc = 0x1badc0de; UtAssert_INT32_EQ(CF_CFDP_R_CheckCrc(txn), CF_ERROR); UT_CF_AssertEventID(CF_CFDP_R_CRC_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.crc_mismatch, 1); + UtAssert_UINT32_EQ(chan->stat.counters.fault.crc_mismatch, 1); /* CRC mismatch, class 2 */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, NULL, &chan, NULL, &txn, NULL); txn->reliable_mode = true; txn->crc.result = 0xdeadbeef; txn->state_data.eof_crc = 0x2badc0de; UtAssert_INT32_EQ(CF_CFDP_R_CheckCrc(txn), CF_ERROR); UT_CF_AssertEventID(CF_CFDP_R_CRC_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.crc_mismatch, 2); + UtAssert_UINT32_EQ(chan->stat.counters.fault.crc_mismatch, 2); /* CRC match */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, NULL, &chan, NULL, &txn, NULL); txn->crc.result = 0xc0ffee; txn->state_data.eof_crc = 0xc0ffee; UtAssert_INT32_EQ(CF_CFDP_R_CheckCrc(txn), CFE_SUCCESS); @@ -446,33 +449,34 @@ void Test_CF_CFDP_R_ProcessFd(void) CF_Transaction_t *txn; CF_Logical_PduBuffer_t *ph; CF_Logical_PduFileDataHeader_t *fd; + CF_Channel_t *chan; /* nominal */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); fd = &ph->int_header.fd; fd->data_len = 100; UT_SetDefaultReturnValue(UT_KEY(CF_WrappedWrite), fd->data_len); UtAssert_INT32_EQ(CF_CFDP_R_ProcessFd(txn, ph), 0); UtAssert_UINT32_EQ(txn->state_data.cached_pos, 100); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.file_data_bytes, 100); + UtAssert_UINT32_EQ(chan->stat.counters.recv.file_data_bytes, 100); UtAssert_STUB_COUNT(CF_WrappedLseek, 0); UtAssert_STUB_COUNT(CF_WrappedWrite, 1); /* call again, but for something at a different offset */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); fd = &ph->int_header.fd; fd->data_len = 100; fd->offset = 200; UT_SetDefaultReturnValue(UT_KEY(CF_WrappedLseek), fd->offset); UtAssert_INT32_EQ(CF_CFDP_R_ProcessFd(txn, ph), 0); UtAssert_UINT32_EQ(txn->state_data.cached_pos, 300); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.file_data_bytes, 200); + UtAssert_UINT32_EQ(chan->stat.counters.recv.file_data_bytes, 200); UtAssert_STUB_COUNT(CF_WrappedLseek, 1); UtAssert_STUB_COUNT(CF_WrappedWrite, 2); UtAssert_UINT32_EQ(txn->state_data.cached_pos, 300); /* call again, but with a failed write */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); fd = &ph->int_header.fd; fd->data_len = 100; fd->offset = 300; @@ -484,7 +488,7 @@ void Test_CF_CFDP_R_ProcessFd(void) UtAssert_INT32_EQ(txn->history->txn_stat, CF_TxnStatus_FILESTORE_REJECTION); /* call again, but with a failed lseek */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); fd = &ph->int_header.fd; fd->data_len = 100; fd->offset = 200; @@ -496,8 +500,8 @@ void Test_CF_CFDP_R_ProcessFd(void) UtAssert_INT32_EQ(txn->history->txn_stat, CF_TxnStatus_FILE_SIZE_ERROR); /* these stats should have been updated during the course of this test */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].counters.fault.file_write, 1); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].counters.fault.file_seek, 1); + UtAssert_UINT32_EQ(chan->stat.counters.fault.file_write, 1); + UtAssert_UINT32_EQ(chan->stat.counters.fault.file_seek, 1); } void Test_CF_CFDP_R_SubstateRecvEof(void) @@ -507,11 +511,12 @@ void Test_CF_CFDP_R_SubstateRecvEof(void) */ CF_Transaction_t *txn; CF_Logical_PduBuffer_t *ph; + CF_Channel_t *chan; UT_SetDefaultReturnValue(UT_KEY(CF_CFDP_CheckAckNakCount), true); /* nominal, accept EOF */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); txn->flags.rx.eof_count = 0; txn->state_data.eof_size = 0; ph->int_header.eof.size = 10; @@ -520,7 +525,7 @@ void Test_CF_CFDP_R_SubstateRecvEof(void) UtAssert_EQ(CF_FileSize_t, txn->state_data.eof_size, 10); /* repeat EOF */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); txn->flags.rx.eof_count = 1; txn->state_data.eof_size = 10; ph->int_header.eof.size = 20; @@ -535,13 +540,13 @@ void Test_CF_CFDP_R_SubstateRecvEof(void) UtAssert_INT32_EQ(txn->history->txn_stat, CF_TxnStatus_POS_ACK_LIMIT_REACHED); /* with failure of CF_CFDP_RecvEof() */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); UT_SetDefaultReturnValue(UT_KEY(CF_CFDP_RecvEof), -1); UtAssert_VOIDCALL(CF_CFDP_R_SubstateRecvEof(txn, ph)); UT_CF_AssertEventID(CF_CFDP_R_PDU_EOF_ERR_EID); /* these counters should have been updated during the test */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].counters.recv.error, 1); + UtAssert_UINT32_EQ(chan->stat.counters.recv.error, 1); } void Test_CF_CFDP_R_SubstateRecvFileData(void) @@ -660,17 +665,18 @@ void Test_CF_CFDP_R_CalcCrcChunk(void) /* Test case for: * int CF_CFDP_R_CalcCrcChunk(CF_Transaction_t *txn); */ - CF_Transaction_t *txn; - CF_ConfigTable_t *config; + CF_Transaction_t *txn; + CF_EngineConfig_t *config; + CF_Channel_t *chan; /* nominal with zero size file */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, &txn, NULL); txn->flags.com.crc_complete = false; UtAssert_VOIDCALL(CF_CFDP_R_CalcCrcChunk(txn)); UtAssert_BOOL_TRUE(txn->flags.com.crc_complete); /* nominal with non zero size file, runs the loop */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, &txn, &config); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, &txn, &config); txn->flags.com.crc_complete = false; config->rx_crc_calc_bytes_per_wakeup = 100; txn->fsize = 70; @@ -679,7 +685,7 @@ void Test_CF_CFDP_R_CalcCrcChunk(void) UtAssert_BOOL_TRUE(txn->flags.com.crc_complete); /* nominal with file larger than rx_crc_calc_bytes_per_wakeup */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, &txn, &config); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, &txn, &config); config->rx_crc_calc_bytes_per_wakeup = CF_R2_CRC_CHUNK_SIZE; txn->fsize = CF_R2_CRC_CHUNK_SIZE + 100; UT_SetDeferredRetcode(UT_KEY(CF_WrappedRead), 1, CF_R2_CRC_CHUNK_SIZE); @@ -687,7 +693,7 @@ void Test_CF_CFDP_R_CalcCrcChunk(void) UtAssert_BOOL_FALSE(txn->flags.com.crc_complete); /* nominal with file size larger than CF_R2_CRC_CHUNK_SIZE (this will do 2 reads) */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, &txn, &config); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, &txn, &config); config->rx_crc_calc_bytes_per_wakeup = CF_R2_CRC_CHUNK_SIZE * 2; txn->fsize = CF_R2_CRC_CHUNK_SIZE + 100; UT_SetDeferredRetcode(UT_KEY(CF_WrappedRead), 1, CF_R2_CRC_CHUNK_SIZE); @@ -696,7 +702,7 @@ void Test_CF_CFDP_R_CalcCrcChunk(void) UtAssert_BOOL_TRUE(txn->flags.com.crc_complete); /* failure of read */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, &txn, &config); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, &txn, &config); config->rx_crc_calc_bytes_per_wakeup = 100; txn->fsize = 50; UT_SetDeferredRetcode(UT_KEY(CF_WrappedRead), 1, -1); @@ -704,7 +710,7 @@ void Test_CF_CFDP_R_CalcCrcChunk(void) UT_CF_AssertEventID(CF_CFDP_R_READ_ERR_EID); UtAssert_BOOL_TRUE(txn->flags.com.crc_complete); UtAssert_INT32_EQ(txn->history->txn_stat, CF_TxnStatus_FILE_SIZE_ERROR); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.file_read, 1); + UtAssert_UINT32_EQ(chan->stat.counters.fault.file_read, 1); } void Test_CF_CFDP_R2_Recv_fin_ack(void) @@ -714,25 +720,26 @@ void Test_CF_CFDP_R2_Recv_fin_ack(void) */ CF_Transaction_t *txn; CF_Logical_PduBuffer_t *ph; + CF_Channel_t *chan; /* nominal */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); ph->int_header.ack.ack_directive_code = CF_CFDP_FileDirective_FIN; UtAssert_VOIDCALL(CF_CFDP_R2_SubstateRecvFinAck(txn, ph)); UtAssert_BOOL_TRUE(txn->flags.rx.finack_recv); - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); txn->flags.rx.finack_recv = false; ph->int_header.ack.ack_directive_code = -1; UtAssert_VOIDCALL(CF_CFDP_R2_SubstateRecvFinAck(txn, ph)); UtAssert_BOOL_FALSE(txn->flags.rx.finack_recv); /* failure in CF_CFDP_RecvAck */ - UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_R_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); UT_SetDeferredRetcode(UT_KEY(CF_CFDP_RecvAck), 1, -1); UtAssert_VOIDCALL(CF_CFDP_R2_SubstateRecvFinAck(txn, ph)); UT_CF_AssertEventID(CF_CFDP_R_PDU_FINACK_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.error, 2); + UtAssert_UINT32_EQ(chan->stat.counters.recv.error, 2); } void Test_CF_CFDP_R_CheckComplete(void) diff --git a/unit-test/cf_cfdp_s_tests.c b/unit-test/cf_cfdp_s_tests.c index 4c9f77f7..6f630301 100644 --- a/unit-test/cf_cfdp_s_tests.c +++ b/unit-test/cf_cfdp_s_tests.c @@ -66,7 +66,7 @@ static void UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_t setup, CF_Channel_t **channel_p, CF_History_t **history_p, CF_Transaction_t **txn_p, - CF_ConfigTable_t **config_table_p) + CF_EngineConfig_t **config_table_p) { /* * fake objects used to pass into CF app during unit tests. @@ -75,7 +75,9 @@ static void UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_t setup, static CF_Logical_PduBuffer_t ut_pdu_buffer; static CF_History_t ut_history; static CF_Transaction_t ut_transaction; - static CF_ConfigTable_t ut_config_table; + + CF_Engine_t *engine_ptr = CF_GetEngine(); + CF_Channel_t *local_channel_p = &engine_ptr->channels[UT_CFDP_CHANNEL_IDX]; /* * always clear all objects, regardless of what was asked for. @@ -85,13 +87,12 @@ static void UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_t setup, memset(&ut_pdu_buffer, 0, sizeof(ut_pdu_buffer)); memset(&ut_history, 0, sizeof(ut_history)); memset(&ut_transaction, 0, sizeof(ut_transaction)); - memset(&ut_config_table, 0, sizeof(ut_config_table)); /* certain pointers should be connected even if they were not asked for, * as internal code may assume these are set (test cases may un-set) */ ut_transaction.history = &ut_history; + ut_transaction.chan_ptr = local_channel_p; ut_history.txn_stat = CF_TxnStatus_UNDEFINED; - CF_AppData.config_table = &ut_config_table; if (pdu_buffer_p) { @@ -115,7 +116,7 @@ static void UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_t setup, * a member of that array, so for now it must be so. * This always uses the same channel for now. */ - *channel_p = &CF_AppData.engine.channels[UT_CFDP_CHANNEL]; + *channel_p = local_channel_p; } if (history_p) { @@ -127,7 +128,7 @@ static void UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_t setup, } if (config_table_p) { - *config_table_p = &ut_config_table; + *config_table_p = &engine_ptr->config; } if (setup == UT_CF_Setup_TX) @@ -240,9 +241,10 @@ void Test_CF_CFDP_S_Tick(void) * void CF_CFDP_S_Tick(CF_Transaction_t *txn); */ CF_Transaction_t *txn; + CF_Channel_t *chan; /* nominal, not in CF_TxSubState_DATA_NORMAL */ - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, &chan, NULL, &txn, NULL); txn->flags.com.inactivity_fired = false; txn->reliable_mode = false; txn->state_data.sub_state = CF_TxSubState_DATA_EOF; @@ -252,7 +254,7 @@ void Test_CF_CFDP_S_Tick(void) /* nominal, with timer expiry */ UT_ResetState(0); - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, &chan, NULL, &txn, NULL); UT_SetDeferredRetcode(UT_KEY(CF_CFDP_GetAckTxnStatus), 1, CF_CFDP_AckTxnStatus_ACTIVE); txn->flags.com.inactivity_fired = false; txn->reliable_mode = false; @@ -262,11 +264,11 @@ void Test_CF_CFDP_S_Tick(void) UtAssert_BOOL_TRUE(txn->flags.com.inactivity_fired); UtAssert_STUB_COUNT(CF_CFDP_RecycleTransaction, 0); UtAssert_STUB_COUNT(CF_CFDP_CompleteTick, 1); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.inactivity_timer, 1); + UtAssert_UINT32_EQ(chan->stat.counters.fault.inactivity_timer, 1); /* nominal, in CF_TxnState_HOLD, with timer expiry */ UT_ResetState(0); - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, &chan, NULL, &txn, NULL); UT_SetDeferredRetcode(UT_KEY(CF_CFDP_GetAckTxnStatus), 1, CF_CFDP_AckTxnStatus_TERMINATED); txn->flags.com.inactivity_fired = false; txn->state = CF_TxnState_HOLD; @@ -278,7 +280,7 @@ void Test_CF_CFDP_S_Tick(void) /* nominal, in CF_TxnState_S2, with timer expiry */ UT_ResetState(0); - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, &chan, NULL, &txn, NULL); UT_SetDeferredRetcode(UT_KEY(CF_Timer_Expired), 1, 1); UT_SetDeferredRetcode(UT_KEY(CF_CFDP_GetAckTxnStatus), 1, CF_CFDP_AckTxnStatus_ACTIVE); txn->flags.com.inactivity_fired = false; @@ -287,13 +289,13 @@ void Test_CF_CFDP_S_Tick(void) UtAssert_VOIDCALL(CF_CFDP_S_Tick(txn)); UtAssert_STUB_COUNT(CF_Timer_Tick, 0); UT_CF_AssertEventID(CF_CFDP_S_INACT_TIMER_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.inactivity_timer, 2); + UtAssert_UINT32_EQ(chan->stat.counters.fault.inactivity_timer, 2); UtAssert_BOOL_TRUE(txn->flags.com.inactivity_fired); UtAssert_STUB_COUNT(CF_CFDP_RecycleTransaction, 0); /* nominal, active transaction */ UT_ResetState(0); - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, &txn, NULL); txn->reliable_mode = false; txn->state_data.sub_state = CF_TxSubState_DATA_NORMAL; UT_SetDeferredRetcode(UT_KEY(CF_CFDP_GetAckTxnStatus), 1, CF_CFDP_AckTxnStatus_ACTIVE); @@ -303,7 +305,7 @@ void Test_CF_CFDP_S_Tick(void) /* inactive transaction */ UT_ResetState(0); - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, &txn, NULL); txn->state = CF_TxnState_HOLD; txn->flags.com.inactivity_fired = true; UtAssert_VOIDCALL(CF_CFDP_S_Tick(txn)); @@ -382,81 +384,82 @@ void Test_CF_CFDP_S_SendFileData(void) /* Test case for: * int32 CF_CFDP_S_SendFileData(CF_Transaction_t *txn, uint32 foffs, uint32 bytes_to_read, uint8 calc_crc); */ - CF_Transaction_t *txn; - CF_ConfigTable_t *config; - uint32 cumulative_read; - uint32 read_size; - uint32 offset; + CF_Transaction_t *txn; + CF_EngineConfig_t *config; + CF_Channel_t *chan; + uint32 cumulative_read; + uint32 read_size; + uint32 offset; cumulative_read = 0; offset = 0; read_size = 100; /* failure of CF_CFDP_ConstructPduHeader */ - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, &txn, NULL); UtAssert_INT32_EQ(CF_CFDP_S_SendFileData(txn, offset, read_size, true), CF_SEND_PDU_NO_BUF_AVAIL_ERROR); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.sent.file_data_bytes, cumulative_read); + UtAssert_UINT32_EQ(chan->stat.counters.sent.file_data_bytes, cumulative_read); /* nominal, smaller than chunk, no CRC */ - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, NULL, NULL, &txn, &config); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, &chan, NULL, &txn, &config); config->outgoing_file_chunk_size = 150; txn->fsize = 300; UT_SetDeferredRetcode(UT_KEY(CF_WrappedRead), 1, read_size); UtAssert_INT32_EQ(CF_CFDP_S_SendFileData(txn, offset, read_size, false), read_size); cumulative_read += read_size; - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.sent.file_data_bytes, cumulative_read); + UtAssert_UINT32_EQ(chan->stat.counters.sent.file_data_bytes, cumulative_read); /* nominal, larger than PDU, no CRC */ - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, NULL, NULL, &txn, &config); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, &chan, NULL, &txn, &config); config->outgoing_file_chunk_size = CF_MAX_PDU_SIZE * 2; txn->fsize = CF_MAX_PDU_SIZE * 2; read_size = CF_MAX_PDU_SIZE; UT_SetDeferredRetcode(UT_KEY(CF_WrappedRead), 1, read_size); UtAssert_INT32_EQ(CF_CFDP_S_SendFileData(txn, offset, read_size * 2, false), read_size); cumulative_read += read_size; - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.sent.file_data_bytes, cumulative_read); + UtAssert_UINT32_EQ(chan->stat.counters.sent.file_data_bytes, cumulative_read); UtAssert_STUB_COUNT(CF_CRC_Digest, 0); /* nominal, larger than chunk, with CRC */ - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, NULL, NULL, &txn, &config); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, &chan, NULL, &txn, &config); config->outgoing_file_chunk_size = 50; read_size = 100; txn->fsize = 300; UT_SetDeferredRetcode(UT_KEY(CF_WrappedRead), 1, config->outgoing_file_chunk_size); UtAssert_INT32_EQ(CF_CFDP_S_SendFileData(txn, offset, read_size, true), config->outgoing_file_chunk_size); cumulative_read += config->outgoing_file_chunk_size; - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.sent.file_data_bytes, cumulative_read); + UtAssert_UINT32_EQ(chan->stat.counters.sent.file_data_bytes, cumulative_read); UtAssert_STUB_COUNT(CF_CRC_Digest, 1); /* read w/failure */ - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, NULL, NULL, &txn, &config); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, &chan, NULL, &txn, &config); UT_SetDeferredRetcode(UT_KEY(CF_WrappedRead), 1, -1); config->outgoing_file_chunk_size = read_size; txn->fsize = 300; UtAssert_INT32_EQ(CF_CFDP_S_SendFileData(txn, offset, read_size, true), -1); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.sent.file_data_bytes, cumulative_read); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.file_read, 1); + UtAssert_UINT32_EQ(chan->stat.counters.sent.file_data_bytes, cumulative_read); + UtAssert_UINT32_EQ(chan->stat.counters.fault.file_read, 1); UT_CF_AssertEventID(CF_CFDP_S_READ_ERR_EID); /* require lseek */ offset = 25; - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, NULL, NULL, &txn, &config); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, &chan, NULL, &txn, &config); UT_SetDeferredRetcode(UT_KEY(CF_WrappedLseek), 1, offset); UT_SetDeferredRetcode(UT_KEY(CF_WrappedRead), 1, read_size); config->outgoing_file_chunk_size = read_size; txn->fsize = 300; UtAssert_INT32_EQ(CF_CFDP_S_SendFileData(txn, offset, read_size, true), read_size); cumulative_read += read_size; - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.sent.file_data_bytes, cumulative_read); + UtAssert_UINT32_EQ(chan->stat.counters.sent.file_data_bytes, cumulative_read); /* lseek w/failure */ - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, NULL, NULL, &txn, &config); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, &chan, NULL, &txn, &config); UT_SetDeferredRetcode(UT_KEY(CF_WrappedLseek), 1, -1); config->outgoing_file_chunk_size = read_size; txn->fsize = 300; UtAssert_INT32_EQ(CF_CFDP_S_SendFileData(txn, offset, read_size, true), -1); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.sent.file_data_bytes, cumulative_read); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.fault.file_seek, 1); + UtAssert_UINT32_EQ(chan->stat.counters.sent.file_data_bytes, cumulative_read); + UtAssert_UINT32_EQ(chan->stat.counters.fault.file_seek, 1); UT_CF_AssertEventID(CF_CFDP_S_SEEK_FD_ERR_EID); } @@ -465,8 +468,8 @@ void Test_CF_CFDP_S_SubstateSendFileData(void) /* Test case for: * void CF_CFDP_S_SubstateSendFileData(CF_Transaction_t *txn); */ - CF_Transaction_t *txn; - CF_ConfigTable_t *config; + CF_Transaction_t *txn; + CF_EngineConfig_t *config; /* nominal, zero bytes processed */ UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_TX, NULL, NULL, NULL, &txn, NULL); @@ -568,35 +571,36 @@ void Test_CF_CFDP_S2_SubstateNak(void) CF_Transaction_t *txn; CF_Logical_PduBuffer_t *ph; CF_Logical_PduNak_t *nak; + CF_Channel_t *chan; /* no segments */ - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); UT_SetDeferredRetcode(UT_KEY(CF_CFDP_RecvNak), 1, CF_ERROR); UtAssert_VOIDCALL(CF_CFDP_S2_SubstateNak(txn, ph)); UT_CF_AssertEventID(CF_CFDP_S_PDU_NAK_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.error, 1); + UtAssert_UINT32_EQ(chan->stat.counters.recv.error, 1); /* nominal, re-send md request (0,0) */ - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); nak = &ph->int_header.nak; nak->segment_list.num_segments = 1; nak->segment_list.segments[0] = (CF_Logical_SegmentRequest_t) { 0, 0 }; UtAssert_VOIDCALL(CF_CFDP_S2_SubstateNak(txn, ph)); UtAssert_BOOL_TRUE(txn->flags.tx.send_md); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.nak_segment_requests, 1); + UtAssert_UINT32_EQ(chan->stat.counters.recv.nak_segment_requests, 1); /* nominal, nonzero offsets */ - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); nak = &ph->int_header.nak; nak->segment_list.num_segments = 2; nak->segment_list.segments[0] = (CF_Logical_SegmentRequest_t) { 0, 200 }; nak->segment_list.segments[1] = (CF_Logical_SegmentRequest_t) { 200, 300 }; txn->fsize = 300; UtAssert_VOIDCALL(CF_CFDP_S2_SubstateNak(txn, ph)); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.nak_segment_requests, 3); + UtAssert_UINT32_EQ(chan->stat.counters.recv.nak_segment_requests, 3); /* bad segments */ - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); nak = &ph->int_header.nak; nak->segment_list.num_segments = 3; nak->segment_list.segments[0] = (CF_Logical_SegmentRequest_t) { 200, 100 }; @@ -604,16 +608,16 @@ void Test_CF_CFDP_S2_SubstateNak(void) nak->segment_list.segments[2] = (CF_Logical_SegmentRequest_t) { 400, 0 }; txn->fsize = 300; UtAssert_VOIDCALL(CF_CFDP_S2_SubstateNak(txn, ph)); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.nak_segment_requests, 6); + UtAssert_UINT32_EQ(chan->stat.counters.recv.nak_segment_requests, 6); UT_CF_AssertEventID(CF_CFDP_S_INVALID_SR_ERR_EID); /* bad decode */ - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); UT_SetDeferredRetcode(UT_KEY(CF_CFDP_RecvNak), 1, -1); nak = &ph->int_header.nak; nak->segment_list.num_segments = 1; UtAssert_VOIDCALL(CF_CFDP_S2_SubstateNak(txn, ph)); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.error, 2); + UtAssert_UINT32_EQ(chan->stat.counters.recv.error, 2); UT_CF_AssertEventID(CF_CFDP_S_PDU_NAK_ERR_EID); } @@ -624,9 +628,10 @@ void Test_CF_CFDP_S2_SubstateEofAck(void) */ CF_Transaction_t *txn; CF_Logical_PduBuffer_t *ph; + CF_Channel_t *chan; /* nominal */ - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); txn->flags.tx.eof_ack_recv = false; ph->int_header.ack.ack_directive_code = CF_CFDP_FileDirective_EOF; UtAssert_VOIDCALL(CF_CFDP_S2_SubstateEofAck(txn, ph)); @@ -634,20 +639,20 @@ void Test_CF_CFDP_S2_SubstateEofAck(void) UtAssert_BOOL_FALSE(txn->flags.com.ack_timer_armed); /* failure of CF_CFDP_RecvAck */ - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); ph->int_header.ack.ack_directive_code = CF_CFDP_FileDirective_EOF; UT_SetDeferredRetcode(UT_KEY(CF_CFDP_RecvAck), 1, -1); UtAssert_VOIDCALL(CF_CFDP_S2_SubstateEofAck(txn, ph)); UT_CF_AssertEventID(CF_CFDP_S_PDU_EOF_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.error, 1); + UtAssert_UINT32_EQ(chan->stat.counters.recv.error, 1); /* Ack not for EOF */ - UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, &txn, NULL); + UT_CFDP_S_SetupBasicTestState(UT_CF_Setup_RX, &ph, &chan, NULL, &txn, NULL); ph->int_header.ack.ack_directive_code = CF_CFDP_FileDirective_FIN; txn->flags.tx.eof_ack_recv = false; UtAssert_VOIDCALL(CF_CFDP_S2_SubstateEofAck(txn, ph)); UT_CF_AssertEventID(CF_CFDP_S_PDU_EOF_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[txn->chan_num].counters.recv.error, 2); + UtAssert_UINT32_EQ(chan->stat.counters.recv.error, 2); } /* Hook function to set FD output on opencreate call */ @@ -1109,9 +1114,9 @@ void Test_CF_CFDP_S_Tick_Nak(void) /* Test Case For: * void CF_CFDP_S_Tick_Nak(CF_Transaction_t *txn) */ - CF_Transaction_t *txn; - CF_ConfigTable_t *config; - CF_Chunk_t chunk; + CF_Transaction_t *txn; + CF_EngineConfig_t *config; + CF_Chunk_t chunk; memset(&chunk, 0, sizeof(chunk)); chunk.size = 100; diff --git a/unit-test/cf_cfdp_sbintf_tests.c b/unit-test/cf_cfdp_sbintf_tests.c index 06099a51..a7a2e0d5 100644 --- a/unit-test/cf_cfdp_sbintf_tests.c +++ b/unit-test/cf_cfdp_sbintf_tests.c @@ -101,7 +101,7 @@ static void UT_CFDP_SetupBasicTestState(UT_CF_Setup_t setup, CF_Channel_t **channel_p, CF_History_t **history_p, CF_Transaction_t **txn_p, - CF_ConfigTable_t **config_table_p) + CF_EngineConfig_t **config_table_p) { /* * fake objects used to pass into CF app during unit tests. @@ -109,7 +109,9 @@ static void UT_CFDP_SetupBasicTestState(UT_CF_Setup_t setup, */ static CF_History_t ut_history; static CF_Transaction_t ut_transaction; - static CF_ConfigTable_t ut_config_table; + + CF_Engine_t *engine_ptr = CF_GetEngine(); + CF_Channel_t *local_channel_p = &engine_ptr->channels[UT_CFDP_CHANNEL_IDX]; /* * always clear all objects, regardless of what was asked for. @@ -118,22 +120,25 @@ static void UT_CFDP_SetupBasicTestState(UT_CF_Setup_t setup, */ memset(&ut_history, 0, sizeof(ut_history)); memset(&ut_transaction, 0, sizeof(ut_transaction)); - memset(&ut_config_table, 0, sizeof(ut_config_table)); /* certain pointers should be connected even if they were not asked for, * as internal code may assume these are set (test cases may un-set) */ ut_transaction.history = &ut_history; - CF_AppData.config_table = &ut_config_table; + ut_transaction.chan_ptr = local_channel_p; + + local_channel_p->outgoing_counter = 0; + local_channel_p->num_cmd_tx = 0; + local_channel_p->tx_blocked = 0; if (pdu_buffer_p) { if (setup == UT_CF_Setup_TX) { - *pdu_buffer_p = &CF_AppData.engine.out.tx_pdudata; + *pdu_buffer_p = &engine_ptr->out.tx_pdudata; } else if (setup == UT_CF_Setup_RX) { - *pdu_buffer_p = &CF_AppData.engine.in.rx_pdudata; + *pdu_buffer_p = &engine_ptr->in.rx_pdudata; } else { @@ -151,7 +156,7 @@ static void UT_CFDP_SetupBasicTestState(UT_CF_Setup_t setup, * a member of that array, so for now it must be so. * This always uses the same channel for now. */ - *channel_p = &CF_AppData.engine.channels[UT_CFDP_CHANNEL]; + *channel_p = local_channel_p; } if (history_p) { @@ -163,25 +168,22 @@ static void UT_CFDP_SetupBasicTestState(UT_CF_Setup_t setup, } if (config_table_p) { - *config_table_p = &ut_config_table; + *config_table_p = &engine_ptr->config; } if (setup == UT_CF_Setup_TX) { /* transmit is likely to invoke CF_CFDP_ConstructPduHeader() which in turn requires MsgOutGet to work */ - UT_CFDP_SetupBasicTxState(&CF_AppData.engine.out.tx_pdudata); + UT_CFDP_SetupBasicTxState(&engine_ptr->out.tx_pdudata); } else if (setup == UT_CF_Setup_RX) { /* most calls on the RX side will do some sort of decode, so set up for that. */ - UT_CFDP_SetupBasicRxState(&CF_AppData.engine.in.rx_pdudata); - ut_config_table.chan[UT_CFDP_CHANNEL].rx_max_messages_per_wakeup = 1; + UT_CFDP_SetupBasicRxState(&engine_ptr->in.rx_pdudata); + local_channel_p->config.rx_max_messages_per_wakeup = 1; } - UT_SetDefaultReturnValue(UT_KEY(CF_GetChannelFromTxn), - (UT_IntReturn_t)&CF_AppData.engine.channels[UT_CFDP_CHANNEL]); - /* reset the event ID capture between each sub-case */ UT_CF_ResetEventCapture(); } @@ -219,11 +221,11 @@ void Test_CF_CFDP_ReceiveMessage(void) /* Test case for: * void CF_CFDP_ReceiveMessage(CF_Channel_t *chan); */ - CF_Channel_t *chan; - CF_ConfigTable_t *config; - CF_Transaction_t *txn; - CFE_MSG_Type_t msg_type; - CFE_MSG_Size_t msg_size_buf; + CF_Channel_t *chan; + CF_EngineConfig_t *config; + CF_Transaction_t *txn; + CFE_MSG_Type_t msg_type; + CFE_MSG_Size_t msg_size_buf; /* no-config - the max per wakeup will be 0, and this is a noop */ UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, NULL, NULL); @@ -231,7 +233,7 @@ void Test_CF_CFDP_ReceiveMessage(void) /* failure in CFE_SB_ReceiveBuffer */ UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, NULL, &config); - config->chan[UT_CFDP_CHANNEL].rx_max_messages_per_wakeup = 1; + chan->config.rx_max_messages_per_wakeup = 1; UT_SetDeferredRetcode(UT_KEY(CFE_SB_ReceiveBuffer), 1, CFE_SB_NO_MESSAGE); UtAssert_VOIDCALL(CF_CFDP_ReceiveMessage(chan)); @@ -256,14 +258,15 @@ void Test_CF_CFDP_ReceiveMessage(void) void Test_CF_CFDP_Send(void) { /* Test case for: - * void CF_CFDP_Send(uint8 chan_num, const CF_Logical_PduBuffer_t *ph) + * void CF_CFDP_Send(CF_Channel_t *chan_ptr, const CF_Logical_PduBuffer_t *ph) */ CF_Logical_PduBuffer_t *ph; + CF_Channel_t *chan; /* nominal */ - UT_CFDP_SetupBasicTestState(UT_CF_Setup_TX, &ph, NULL, NULL, NULL, NULL); - UtAssert_VOIDCALL(CF_CFDP_Send(UT_CFDP_CHANNEL, ph)); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].counters.sent.pdu, 1); + UT_CFDP_SetupBasicTestState(UT_CF_Setup_TX, &ph, &chan, NULL, NULL, NULL); + UtAssert_VOIDCALL(CF_CFDP_Send(chan, ph)); + UtAssert_UINT32_EQ(chan->stat.counters.sent.pdu, 1); UtAssert_STUB_COUNT(CFE_MSG_SetSize, 1); UtAssert_STUB_COUNT(CFE_SB_TransmitBuffer, 1); } @@ -273,27 +276,30 @@ void Test_CF_CFDP_MsgOutGet(void) /* Test case for: CF_Logical_PduBuffer_t *CF_CFDP_MsgOutGet(const CF_Transaction_t *txn, bool silent) */ - CF_Transaction_t *txn; - CF_ConfigTable_t *config; - CF_Channel_t *chan; + CF_Transaction_t *txn; + CF_EngineConfig_t *config; + CF_Channel_t *chan; /* nominal */ - UT_CFDP_SetupBasicTestState(UT_CF_Setup_TX, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_SetupBasicTestState(UT_CF_Setup_TX, NULL, &chan, NULL, &txn, NULL); UtAssert_NOT_NULL(CF_CFDP_MsgOutGet(txn, false)); UtAssert_STUB_COUNT(CFE_SB_ReleaseMessageBuffer, 0); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 0); /* This should discard the old message, and get a new one */ - UT_CFDP_SetupBasicTestState(UT_CF_Setup_TX, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_SetupBasicTestState(UT_CF_Setup_TX, NULL, &chan, NULL, &txn, NULL); UtAssert_NOT_NULL(CF_CFDP_MsgOutGet(txn, false)); UtAssert_STUB_COUNT(CFE_SB_ReleaseMessageBuffer, 1); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 0); /* test the various throttling mechanisms */ - UT_CFDP_SetupBasicTestState(UT_CF_Setup_TX, NULL, NULL, NULL, &txn, &config); - config->chan[UT_CFDP_CHANNEL].max_outgoing_messages_per_wakeup = 3; + UT_CFDP_SetupBasicTestState(UT_CF_Setup_TX, NULL, &chan, NULL, &txn, &config); + chan->config.max_outgoing_messages_per_wakeup = 3; + chan->outgoing_counter = 2; UtAssert_NOT_NULL(CF_CFDP_MsgOutGet(txn, false)); + UtAssert_BOOL_FALSE(chan->tx_blocked); UtAssert_NULL(CF_CFDP_MsgOutGet(txn, false)); + UtAssert_BOOL_TRUE(chan->tx_blocked); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 0); UT_CFDP_SetupBasicTestState(UT_CF_Setup_TX, NULL, &chan, NULL, &txn, NULL); @@ -304,25 +310,25 @@ void Test_CF_CFDP_MsgOutGet(void) UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 0); /* transaction is suspended */ - UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, &txn, NULL); txn->flags.com.suspended = true; UtAssert_NULL(CF_CFDP_MsgOutGet(txn, false)); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 0); /* channel is frozen */ - UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, &txn, NULL); - CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].frozen = 1; + UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, &txn, NULL); + chan->stat.frozen = 1; UtAssert_NULL(CF_CFDP_MsgOutGet(txn, false)); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 0); - CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].frozen = 0; + chan->stat.frozen = 0; /* no msg available from SB */ - UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, &txn, NULL); UtAssert_NULL(CF_CFDP_MsgOutGet(txn, false)); UT_CF_AssertEventID(CF_CFDP_NO_MSG_ERR_EID); /* same, but the silent flag should suppress the event */ - UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, &txn, NULL); UtAssert_NULL(CF_CFDP_MsgOutGet(txn, true)); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 0); } diff --git a/unit-test/cf_cfdp_tests.c b/unit-test/cf_cfdp_tests.c index 6383e3ee..c39560d3 100644 --- a/unit-test/cf_cfdp_tests.c +++ b/unit-test/cf_cfdp_tests.c @@ -69,7 +69,7 @@ static void UT_CFDP_SetupBasicTestState(UT_CF_Setup_t setup, CF_Channel_t **channel_p, CF_History_t **history_p, CF_Transaction_t **txn_p, - CF_ConfigTable_t **config_table_p) + CF_EngineConfig_t **config_table_p) { /* * fake objects used to pass into CF app during unit tests. @@ -78,7 +78,9 @@ static void UT_CFDP_SetupBasicTestState(UT_CF_Setup_t setup, static CF_Logical_PduBuffer_t ut_pdu_buffer; static CF_History_t ut_history; static CF_Transaction_t ut_transaction; - static CF_ConfigTable_t ut_config_table; + + CF_Engine_t *engine_ptr = CF_GetEngine(); + CF_Channel_t *local_channel_p = &engine_ptr->channels[UT_CFDP_CHANNEL_IDX]; /* * always clear all objects, regardless of what was asked for. @@ -88,12 +90,11 @@ static void UT_CFDP_SetupBasicTestState(UT_CF_Setup_t setup, memset(&ut_pdu_buffer, 0, sizeof(ut_pdu_buffer)); memset(&ut_history, 0, sizeof(ut_history)); memset(&ut_transaction, 0, sizeof(ut_transaction)); - memset(&ut_config_table, 0, sizeof(ut_config_table)); /* certain pointers should be connected even if they were not asked for, * as internal code may assume these are set (test cases may un-set) */ ut_transaction.history = &ut_history; - CF_AppData.config_table = &ut_config_table; + ut_transaction.chan_ptr = local_channel_p; if (pdu_buffer_p) { @@ -117,7 +118,7 @@ static void UT_CFDP_SetupBasicTestState(UT_CF_Setup_t setup, * a member of that array, so for now it must be so. * This always uses the same channel for now. */ - *channel_p = &CF_AppData.engine.channels[UT_CFDP_CHANNEL]; + *channel_p = local_channel_p; } if (history_p) { @@ -129,7 +130,7 @@ static void UT_CFDP_SetupBasicTestState(UT_CF_Setup_t setup, } if (config_table_p) { - *config_table_p = &ut_config_table; + *config_table_p = &engine_ptr->config; } if (setup == UT_CF_Setup_TX) @@ -146,10 +147,7 @@ static void UT_CFDP_SetupBasicTestState(UT_CF_Setup_t setup, UT_CFDP_SetupBasicRxState(&ut_pdu_buffer); } - UT_SetDefaultReturnValue(UT_KEY(CF_GetChannelFromTxn), - (UT_IntReturn_t)&CF_AppData.engine.channels[UT_CFDP_CHANNEL]); - UT_SetDefaultReturnValue(UT_KEY(CF_GetChunkListHead), - (UT_IntReturn_t)&CF_AppData.engine.channels[UT_CFDP_CHANNEL].cs[ut_history.dir]); + UT_SetDefaultReturnValue(UT_KEY(CF_GetChunkListHead), (UT_IntReturn_t)&local_channel_p->cs[ut_history.dir]); /* reset the event ID capture between each sub-case */ UT_CF_ResetEventCapture(); @@ -252,8 +250,8 @@ void Test_CF_CFDP_ArmAckTimer(void) /* Test case for: * void CF_CFDP_ArmAckTimer(CF_Transaction_t *txn) */ - CF_Transaction_t *txn; - CF_ConfigTable_t *config; + CF_Transaction_t *txn; + CF_EngineConfig_t *config; UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, &txn, &config); @@ -264,35 +262,35 @@ void Test_CF_CFDP_ArmAckTimer(void) void Test_CF_CFDP_RecvPh(void) { /* Test case for: - * int CF_CFDP_RecvPh(uint8 chan_num, const CFE_SB_Buffer_t *msgbuf, CF_Logical_PduBuffer_t **pph) + * int CF_CFDP_RecvPh(CF_Channel_t *chan_ptr, const CFE_SB_Buffer_t *msgbuf, CF_Logical_PduBuffer_t **pph) */ CF_Logical_PduBuffer_t *ph; /* nominal, file directive */ UT_CFDP_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, NULL, NULL); - UtAssert_INT32_EQ(CF_CFDP_RecvPh(UT_CFDP_CHANNEL, ph), 0); + UtAssert_INT32_EQ(CF_CFDP_RecvPh(UT_CFDP_CHANNEL_PTR, ph), 0); /* nominal, file data */ UT_CFDP_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, NULL, NULL); ph->pdu_header.pdu_type = 1; - UtAssert_INT32_EQ(CF_CFDP_RecvPh(UT_CFDP_CHANNEL, ph), 0); + UtAssert_INT32_EQ(CF_CFDP_RecvPh(UT_CFDP_CHANNEL_PTR, ph), 0); /* decode error, fixed part */ UT_CFDP_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, NULL, NULL); CF_CODEC_SET_DONE(ph->pdec); - UtAssert_INT32_EQ(CF_CFDP_RecvPh(UT_CFDP_CHANNEL, ph), CF_SHORT_PDU_ERROR); + UtAssert_INT32_EQ(CF_CFDP_RecvPh(UT_CFDP_CHANNEL_PTR, ph), CF_SHORT_PDU_ERROR); UT_CF_AssertEventID(CF_PDU_SHORT_HEADER_ERR_EID); /* decode error, large file bit set */ UT_CFDP_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, NULL, NULL); ph->pdu_header.large_flag = true; - UtAssert_INT32_EQ(CF_CFDP_RecvPh(UT_CFDP_CHANNEL, ph), CF_ERROR); + UtAssert_INT32_EQ(CF_CFDP_RecvPh(UT_CFDP_CHANNEL_PTR, ph), CF_ERROR); UT_CF_AssertEventID(CF_PDU_LARGE_FILE_ERR_EID); /* decode error, insufficient storage for EID or seq num */ UT_CFDP_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, NULL, NULL); UT_SetDeferredRetcode(UT_KEY(CF_CFDP_DecodeHeader), 1, CF_ERROR); - UtAssert_INT32_EQ(CF_CFDP_RecvPh(UT_CFDP_CHANNEL, ph), CF_ERROR); + UtAssert_INT32_EQ(CF_CFDP_RecvPh(UT_CFDP_CHANNEL_PTR, ph), CF_ERROR); UT_CF_AssertEventID(CF_PDU_TRUNCATION_ERR_EID); } @@ -820,7 +818,7 @@ void Test_CF_CFDP_AppendTlv(void) This helper is used by EOF and FIN to set TLV values */ CF_Logical_PduBuffer_t *ph; - CF_ConfigTable_t *config; + CF_EngineConfig_t *config; CF_Logical_TlvList_t *tlv_list; UT_CFDP_SetupBasicTestState(UT_CF_Setup_TX, &ph, NULL, NULL, NULL, &config); @@ -847,56 +845,64 @@ void Test_CF_CFDP_InitEngine(void) /* Test case for: * int32 CF_CFDP_InitEngine(void) */ - CF_ConfigTable_t *config; + CF_EngineConfig_t *config; + CF_Channel_t *chan; + CF_Engine_t *engine_ptr = CF_GetEngine(); /* nominal call, no sem */ - UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, NULL, &config); - UtAssert_INT32_EQ(CF_CFDP_InitEngine(), 0); - UtAssert_BOOL_TRUE(CF_AppData.engine.enabled); - UtAssert_STUB_COUNT(CF_FreeTransaction, CF_NUM_TRANSACTIONS_PER_CHANNEL * CF_NUM_CHANNELS); + memset(engine_ptr, 0, sizeof(*engine_ptr)); + UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, NULL, &config); + UtAssert_INT32_EQ(CF_CFDP_InitEngine(engine_ptr), 0); + UtAssert_BOOL_TRUE(engine_ptr->enabled); /* nominal call, with sem */ - UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, NULL, &config); - config->chan[0].sem_name[0] = 'u'; - UtAssert_INT32_EQ(CF_CFDP_InitEngine(), 0); - UtAssert_BOOL_TRUE(CF_AppData.engine.enabled); + memset(engine_ptr, 0, sizeof(*engine_ptr)); + UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, NULL, &config); + chan->config.sem_name[0] = 'u'; + UtAssert_INT32_EQ(CF_CFDP_InitEngine(engine_ptr), 0); + UtAssert_BOOL_TRUE(engine_ptr->enabled); /* failure of OS_CountSemGetIdByName for non-name reason */ - UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, NULL, &config); - config->chan[0].sem_name[0] = 'u'; + memset(engine_ptr, 0, sizeof(*engine_ptr)); + UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, NULL, &config); + chan->config.sem_name[0] = 'u'; UT_SetDefaultReturnValue(UT_KEY(OS_CountSemGetIdByName), OS_ERROR); - UtAssert_INT32_EQ(CF_CFDP_InitEngine(), OS_ERROR); - UtAssert_BOOL_FALSE(CF_AppData.engine.enabled); + UtAssert_INT32_EQ(CF_CFDP_InitEngine(engine_ptr), OS_ERROR); + UtAssert_BOOL_FALSE(engine_ptr->enabled); UT_CF_AssertEventID(CF_INIT_SEM_ERR_EID); /* Max retries of OS_CountSemGetIdByName - sem was never created at all */ - UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, NULL, &config); - config->chan[0].sem_name[0] = 'u'; + memset(engine_ptr, 0, sizeof(*engine_ptr)); + UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, NULL, &config); + chan->config.sem_name[0] = 'u'; UT_SetDefaultReturnValue(UT_KEY(OS_CountSemGetIdByName), OS_ERR_NAME_NOT_FOUND); - UtAssert_INT32_EQ(CF_CFDP_InitEngine(), OS_ERR_NAME_NOT_FOUND); - UtAssert_BOOL_FALSE(CF_AppData.engine.enabled); + UtAssert_INT32_EQ(CF_CFDP_InitEngine(engine_ptr), OS_ERR_NAME_NOT_FOUND); + UtAssert_BOOL_FALSE(engine_ptr->enabled); UT_CF_AssertEventID(CF_INIT_SEM_ERR_EID); /* Retry of OS_CountSemGetIdByName, when sem was created late, and thus * got return OS_ERR_NAME_NOT_FOUND followed by OS_SUCCESS */ - UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, NULL, &config); - config->chan[0].sem_name[0] = 'u'; + memset(engine_ptr, 0, sizeof(*engine_ptr)); + UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, NULL, &config); + chan->config.sem_name[0] = 'u'; UT_SetDefaultReturnValue(UT_KEY(OS_CountSemGetIdByName), OS_SUCCESS); UT_SetDeferredRetcode(UT_KEY(OS_CountSemGetIdByName), 1, OS_ERR_NAME_NOT_FOUND); - UtAssert_INT32_EQ(CF_CFDP_InitEngine(), 0); - UtAssert_BOOL_TRUE(CF_AppData.engine.enabled); + UtAssert_INT32_EQ(CF_CFDP_InitEngine(engine_ptr), 0); + UtAssert_BOOL_TRUE(engine_ptr->enabled); /* failure of CFE_SB_CreatePipe */ - UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, NULL, &config); + memset(engine_ptr, 0, sizeof(*engine_ptr)); + UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, NULL, &config); UT_SetDeferredRetcode(UT_KEY(CFE_SB_CreatePipe), 1, CFE_STATUS_EXTERNAL_RESOURCE_FAIL); - UtAssert_INT32_EQ(CF_CFDP_InitEngine(), CFE_STATUS_EXTERNAL_RESOURCE_FAIL); - UtAssert_BOOL_FALSE(CF_AppData.engine.enabled); + UtAssert_INT32_EQ(CF_CFDP_InitEngine(engine_ptr), CFE_STATUS_EXTERNAL_RESOURCE_FAIL); + UtAssert_BOOL_FALSE(engine_ptr->enabled); /* failure of CFE_SB_SubscribeLocal */ - UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, NULL, &config); + memset(engine_ptr, 0, sizeof(*engine_ptr)); + UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, NULL, &config); UT_SetDeferredRetcode(UT_KEY(CFE_SB_SubscribeLocal), 1, CFE_STATUS_EXTERNAL_RESOURCE_FAIL); - UtAssert_INT32_EQ(CF_CFDP_InitEngine(), CFE_STATUS_EXTERNAL_RESOURCE_FAIL); - UtAssert_BOOL_FALSE(CF_AppData.engine.enabled); + UtAssert_INT32_EQ(CF_CFDP_InitEngine(engine_ptr), CFE_STATUS_EXTERNAL_RESOURCE_FAIL); + UtAssert_BOOL_FALSE(engine_ptr->enabled); } void Test_CF_CFDP_TxFile(void) @@ -922,7 +928,7 @@ void Test_CF_CFDP_TxFile(void) UT_SetHandlerFunction(UT_KEY(CF_FindUnusedTransaction), UT_AltHandler_GenericPointerReturn, txn); UT_SetHandlerFunction(UT_KEY(CF_CList_Pop), UT_AltHandler_GenericPointerReturn, &chunk_wrap.cl_node); chan->cs[CF_Direction_TX] = &chunk_wrap.cl_node; - UtAssert_INT32_EQ(CF_CFDP_TxFile(src, dest, CF_CFDP_CLASS_1, 1, UT_CFDP_CHANNEL, 0, 1), 0); + UtAssert_INT32_EQ(CF_CFDP_TxFile(src, dest, CF_CFDP_Class_1, 1, UT_CFDP_CHANNEL_PTR, 0, 1), 0); UtAssert_STRINGBUF_EQ(dest, -1, history->fnames.dst_filename, sizeof(history->fnames.dst_filename)); UtAssert_STRINGBUF_EQ(src, -1, history->fnames.src_filename, sizeof(history->fnames.src_filename)); UtAssert_UINT32_EQ(chan->num_cmd_tx, 1); @@ -933,7 +939,7 @@ void Test_CF_CFDP_TxFile(void) UT_SetHandlerFunction(UT_KEY(CF_FindUnusedTransaction), UT_AltHandler_GenericPointerReturn, txn); UT_SetHandlerFunction(UT_KEY(CF_CList_Pop), UT_AltHandler_GenericPointerReturn, &chunk_wrap.cl_node); chan->cs[CF_Direction_TX] = &chunk_wrap.cl_node; - UtAssert_INT32_EQ(CF_CFDP_TxFile(src, dest, CF_CFDP_CLASS_2, 1, UT_CFDP_CHANNEL, 0, 1), 0); + UtAssert_INT32_EQ(CF_CFDP_TxFile(src, dest, CF_CFDP_Class_2, 1, UT_CFDP_CHANNEL_PTR, 0, 1), 0); UtAssert_STRINGBUF_EQ(dest, -1, history->fnames.dst_filename, sizeof(history->fnames.dst_filename)); UtAssert_STRINGBUF_EQ(src, -1, history->fnames.src_filename, sizeof(history->fnames.src_filename)); UtAssert_UINT32_EQ(chan->num_cmd_tx, 2); @@ -942,29 +948,30 @@ void Test_CF_CFDP_TxFile(void) /* max TX */ UT_CFDP_SetupBasicTestState(UT_CF_Setup_TX, NULL, &chan, &history, &txn, NULL); chan->num_cmd_tx = CF_MAX_COMMANDED_PLAYBACK_FILES_PER_CHAN; - UtAssert_INT32_EQ(CF_CFDP_TxFile(src, dest, CF_CFDP_CLASS_1, 1, UT_CFDP_CHANNEL, 0, 1), -1); + UtAssert_INT32_EQ(CF_CFDP_TxFile(src, dest, CF_CFDP_Class_1, 1, UT_CFDP_CHANNEL_PTR, 0, 1), -1); UT_CF_AssertEventID(CF_CFDP_MAX_CMD_TX_ERR_EID); } void Test_CF_CFDP_StartRxTransaction(void) { /* Test case for: - * CF_Transaction_t *CF_CFDP_StartRxTransaction(uint8 chan_num); + * CF_Transaction_t *CF_CFDP_StartRxTransaction(CF_Channel_t *chan_ptr); */ CF_Transaction_t *txn; + CF_Channel_t *chan = UT_CFDP_CHANNEL_PTR; /* Reject at limit */ - CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].q_size[CF_QueueIdx_RX] = CF_MAX_SIMULTANEOUS_RX; - UtAssert_NULL(CF_CFDP_StartRxTransaction(UT_CFDP_CHANNEL)); + chan->stat.q_size[CF_QueueIdx_RX] = CF_MAX_SIMULTANEOUS_RX; + UtAssert_NULL(CF_CFDP_StartRxTransaction(chan)); /* Under limit but FindUnusedTransaction still fails */ - CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].q_size[CF_QueueIdx_RX] = CF_MAX_SIMULTANEOUS_RX - 1; - UtAssert_NULL(CF_CFDP_StartRxTransaction(UT_CFDP_CHANNEL)); + chan->stat.q_size[CF_QueueIdx_RX] = CF_MAX_SIMULTANEOUS_RX - 1; + UtAssert_NULL(CF_CFDP_StartRxTransaction(chan)); /* Set so FindUnusedTransaction returns non-null (nominal) */ UT_CFDP_SetupBasicTestState(UT_CF_Setup_RX, NULL, NULL, NULL, &txn, NULL); UT_SetHandlerFunction(UT_KEY(CF_FindUnusedTransaction), UT_AltHandler_GenericPointerReturn, txn); - UtAssert_ADDRESS_EQ(CF_CFDP_StartRxTransaction(UT_CFDP_CHANNEL), txn); + UtAssert_ADDRESS_EQ(CF_CFDP_StartRxTransaction(chan), txn); UtAssert_UINT8_EQ(txn->flags.com.q_index, CF_QueueIdx_RX); } @@ -985,7 +992,7 @@ void Test_CF_CFDP_PlaybackDir(void) UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, NULL, NULL); pb = &chan->playback[0]; memset(pb, 0, sizeof(*pb)); - UtAssert_INT32_EQ(CF_CFDP_PlaybackDir(src, dest, CF_CFDP_CLASS_1, 1, UT_CFDP_CHANNEL, 0, 1), 0); + UtAssert_INT32_EQ(CF_CFDP_PlaybackDir(src, dest, CF_CFDP_Class_1, 1, chan, 0, 1), 0); UtAssert_STRINGBUF_EQ(dest, -1, pb->fnames.dst_filename, sizeof(pb->fnames.dst_filename)); UtAssert_STRINGBUF_EQ(src, -1, pb->fnames.src_filename, sizeof(pb->fnames.src_filename)); UtAssert_BOOL_TRUE(pb->diropen); @@ -994,7 +1001,7 @@ void Test_CF_CFDP_PlaybackDir(void) /* OS_DirectoryOpen fail */ memset(pb, 0, sizeof(*pb)); UT_SetDeferredRetcode(UT_KEY(OS_DirectoryOpen), 1, OS_ERROR); - UtAssert_INT32_EQ(CF_CFDP_PlaybackDir(src, dest, CF_CFDP_CLASS_1, 1, UT_CFDP_CHANNEL, 0, 1), -1); + UtAssert_INT32_EQ(CF_CFDP_PlaybackDir(src, dest, CF_CFDP_Class_1, 1, chan, 0, 1), -1); UT_CF_AssertEventID(CF_CFDP_OPENDIR_ERR_EID); /* no non-busy entries */ @@ -1004,16 +1011,18 @@ void Test_CF_CFDP_PlaybackDir(void) pb = &chan->playback[i]; pb->busy = true; } - UtAssert_INT32_EQ(CF_CFDP_PlaybackDir(src, dest, CF_CFDP_CLASS_1, 1, UT_CFDP_CHANNEL, 0, 1), -1); + UtAssert_INT32_EQ(CF_CFDP_PlaybackDir(src, dest, CF_CFDP_Class_1, 1, chan, 0, 1), -1); UT_CF_AssertEventID(CF_CFDP_DIR_SLOT_ERR_EID); } static int32 Ut_Hook_StateHandler_SetCount(void *UserObj, int32 StubRetcode, uint32 CallCount, const UT_StubContext_t *Context) { + CF_Channel_t *chan = UserObj; + if (CallCount < 3) { - ++CF_AppData.engine.channels[UT_CFDP_CHANNEL].outgoing_counter; + ++chan->outgoing_counter; } return StubRetcode; } @@ -1027,12 +1036,12 @@ void Test_CF_CFDP_S_Tick_NewData(void) CF_Channel_t *chan; /* suspended (do nothing) */ - UT_CFDP_SetupBasicTestState(UT_CF_Setup_TX, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_SetupBasicTestState(UT_CF_Setup_TX, NULL, &chan, NULL, &txn, NULL); txn->flags.com.suspended = true; UtAssert_VOIDCALL(CF_CFDP_S_Tick_NewData(txn)); /* nominal, not in normal data state (do nothing) */ - UT_CFDP_SetupBasicTestState(UT_CF_Setup_TX, NULL, NULL, NULL, &txn, NULL); + UT_CFDP_SetupBasicTestState(UT_CF_Setup_TX, NULL, &chan, NULL, &txn, NULL); txn->flags.com.suspended = false; txn->state_data.sub_state = CF_TxSubState_DATA_EOF; UtAssert_VOIDCALL(CF_CFDP_S_Tick_NewData(txn)); @@ -1041,13 +1050,15 @@ void Test_CF_CFDP_S_Tick_NewData(void) UT_SetHandlerFunction(UT_KEY(CF_GetChannelFromTxn), UT_AltHandler_GenericPointerReturn, chan); txn->flags.com.suspended = false; txn->state_data.sub_state = CF_TxSubState_DATA_NORMAL; - UT_SetHookFunction(UT_KEY(CF_CFDP_S_SubstateSendFileData), Ut_Hook_StateHandler_SetCount, NULL); + UT_SetHookFunction(UT_KEY(CF_CFDP_S_SubstateSendFileData), Ut_Hook_StateHandler_SetCount, chan); UtAssert_VOIDCALL(CF_CFDP_S_Tick_NewData(txn)); } static void DoTickFnSetBlocked(CF_Transaction_t *txn) { - CF_AppData.engine.channels[txn->chan_num].tx_blocked = true; + CF_Channel_t *chan = CF_GetChannelFromTxn(txn); + + chan->tx_blocked = true; } static void DoTickNoop(CF_Transaction_t *txn) @@ -1099,25 +1110,25 @@ void Test_CF_CFDP_ProcessPollingDirectories(void) /* Test case for: * void CF_CFDP_ProcessPollingDirectories(CF_Channel_t *chan) */ - CF_Channel_t *chan; - CF_ConfigTable_t *config; - CF_PollDir_t *pdcfg; - CF_Poll_t *poll; + CF_Channel_t *chan; + CF_EngineConfig_t *config; + CF_LocalPdConfig_t *pdcfg; + CF_Poll_t *poll; UT_CFDP_SetupBasicTestState(UT_CF_Setup_TX, NULL, &chan, NULL, NULL, &config); - pdcfg = &config->chan[UT_CFDP_CHANNEL].polldir[0]; + pdcfg = &chan->config.polldir[0]; poll = &chan->poll[0]; /* nominal call, polldir disabled (noop) */ UtAssert_VOIDCALL(CF_CFDP_ProcessPollingDirectories(chan)); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].poll_counter, 0); + UtAssert_UINT32_EQ(chan->stat.poll_counter, 0); /* nominal call, polldir enabled but interval_sec == 0 */ /* Will tick because CF_Timer_Expired stub returns 0 by default (not expired) */ pdcfg->enabled = 1; UtAssert_VOIDCALL(CF_CFDP_ProcessPollingDirectories(chan)); UtAssert_BOOL_FALSE(poll->timer_set); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].poll_counter, 1); + UtAssert_UINT32_EQ(chan->stat.poll_counter, 1); UtAssert_STUB_COUNT(CF_Timer_Tick, 1); /* with interval_sec nonzero the timer should get set, but not tick */ @@ -1125,7 +1136,7 @@ void Test_CF_CFDP_ProcessPollingDirectories(void) UtAssert_VOIDCALL(CF_CFDP_ProcessPollingDirectories(chan)); UtAssert_BOOL_TRUE(poll->timer_set); UtAssert_STUB_COUNT(CF_Timer_Tick, 1); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].poll_counter, 1); + UtAssert_UINT32_EQ(chan->stat.poll_counter, 1); /* call again should tick */ UtAssert_VOIDCALL(CF_CFDP_ProcessPollingDirectories(chan)); @@ -1137,7 +1148,7 @@ void Test_CF_CFDP_ProcessPollingDirectories(void) UtAssert_VOIDCALL(CF_CFDP_ProcessPollingDirectories(chan)); UtAssert_BOOL_FALSE(poll->timer_set); UtAssert_BOOL_TRUE(poll->pb.busy); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].poll_counter, 1); + UtAssert_UINT32_EQ(chan->stat.poll_counter, 1); /* make an error occur in CF_CFDP_PlaybackDir_Initiate() */ poll->pb.busy = false; /* above would have set it true */ @@ -1167,7 +1178,7 @@ void Test_CF_CFDP_ProcessPollingDirectories(void) /* test that call to CF_CFDP_UpdatePollPbCounted will decrement back to 0 again */ pdcfg->enabled = 0; UtAssert_VOIDCALL(CF_CFDP_ProcessPollingDirectories(chan)); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].poll_counter, 0); + UtAssert_UINT32_EQ(chan->stat.poll_counter, 0); } void Test_CF_CFDP_ProcessPlaybackDirectory(void) @@ -1175,19 +1186,20 @@ void Test_CF_CFDP_ProcessPlaybackDirectory(void) /* Test case for: * void CF_CFDP_ProcessPlaybackDirectory(CF_Channel_t *chan, CF_Playback_t *pb) */ - CF_Transaction_t *txn; - CF_History_t *history; - CF_Channel_t *chan; - CF_ConfigTable_t *config; - CF_Playback_t pb; - os_dirent_t dirent[3]; - CF_ChunkWrapper_t chunk_wrap; + CF_Transaction_t *txn; + CF_History_t *history; + CF_Channel_t *chan; + CF_EngineConfig_t *config; + CF_Playback_t pb; + os_dirent_t dirent[3]; + CF_ChunkWrapper_t chunk_wrap; + CF_Engine_t *engine_ptr = CF_GetEngine(); memset(&chunk_wrap, 0, sizeof(chunk_wrap)); memset(&pb, 0, sizeof(pb)); memset(dirent, 0, sizeof(dirent)); UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, &history, &txn, &config); - CF_AppData.engine.enabled = true; + engine_ptr->enabled = true; /* diropen is true but num_ts is high so operations are restricted */ pb.busy = true; @@ -1262,9 +1274,11 @@ static int32 Ut_Hook_TickTransactions_UpdateCount(void *UserOb uint32 CallCount, const UT_StubContext_t *Context) { + CF_Channel_t *chan = UserObj; + if (CallCount < 5) { - ++CF_AppData.engine.channels[UT_CFDP_CHANNEL].outgoing_counter; + ++chan->outgoing_counter; } return StubRetcode; @@ -1283,12 +1297,12 @@ void Test_CF_CFDP_TickTransactions(void) UtAssert_STUB_COUNT(CF_CList_Traverse, 4); UT_ResetState(UT_KEY(CF_CList_Traverse)); - UT_SetHookFunction(UT_KEY(CF_CList_Traverse), Ut_Hook_TickTransactions_SetBlocked, NULL); + UT_SetHookFunction(UT_KEY(CF_CList_Traverse), Ut_Hook_TickTransactions_SetBlocked, chan); UtAssert_VOIDCALL(CF_CFDP_TickTransactions(chan)); UtAssert_STUB_COUNT(CF_CList_Traverse, 2); UT_ResetState(UT_KEY(CF_CList_Traverse)); - UT_SetHookFunction(UT_KEY(CF_CList_Traverse), Ut_Hook_TickTransactions_UpdateCount, NULL); + UT_SetHookFunction(UT_KEY(CF_CList_Traverse), Ut_Hook_TickTransactions_UpdateCount, chan); chan->tx_blocked = false; UtAssert_VOIDCALL(CF_CFDP_TickTransactions(chan)); UtAssert_STUB_COUNT(CF_CList_Traverse, 7); /* because NAK is repeated several times */ @@ -1299,6 +1313,7 @@ void Test_CF_CFDP_CycleEngine(void) /* Test case for: * void CF_CFDP_CycleEngine(void) */ + CF_Engine_t *engine_ptr = CF_GetEngine(); CF_Channel_t *chan; /* nominal with engine disabled, noop */ @@ -1306,11 +1321,11 @@ void Test_CF_CFDP_CycleEngine(void) UtAssert_VOIDCALL(CF_CFDP_CycleEngine()); /* enabled but frozen */ - CF_AppData.engine.enabled = true; - CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].frozen = 1; + engine_ptr->enabled = true; + chan->stat.frozen = 1; UtAssert_VOIDCALL(CF_CFDP_CycleEngine()); - CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].frozen = 0; + chan->stat.frozen = 0; UtAssert_VOIDCALL(CF_CFDP_CycleEngine()); } @@ -1322,12 +1337,12 @@ void Test_CF_CFDP_FinishTransaction(void) CF_Transaction_t *txn; CF_History_t *history; - CF_Channel_t *chan; + CF_Channel_t *chan = UT_CFDP_CHANNEL_PTR; CF_Playback_t pb; memset(&pb, 0, sizeof(pb)); - CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].q_size[CF_QueueIdx_TX] = 10; + chan->stat.q_size[CF_QueueIdx_TX] = 10; /* Attempt to reset a transaction that has already been freed*/ UT_CFDP_SetupBasicTestState(UT_CF_Setup_RX, NULL, NULL, NULL, &txn, NULL); @@ -1398,8 +1413,9 @@ void Test_CF_CFDP_RecycleTransaction(void) */ CF_Transaction_t *txn; CF_ChunkWrapper_t cl; + CF_Channel_t *chan = UT_CFDP_CHANNEL_PTR; - CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].q_size[CF_QueueIdx_TX] = 10; + chan->stat.q_size[CF_QueueIdx_TX] = 10; /* nominal */ UT_CFDP_SetupBasicTestState(UT_CF_Setup_TX, NULL, NULL, NULL, &txn, NULL); @@ -1436,7 +1452,7 @@ void Test_CF_CFDP_RecycleTransaction(void) UtAssert_VOIDCALL(CF_CFDP_RecycleTransaction(txn)); /* Invalid - channel not known */ - UT_ResetState(UT_KEY(CF_GetChannelFromTxn)); + txn->chan_ptr = NULL; UtAssert_VOIDCALL(CF_CFDP_RecycleTransaction(txn)); } @@ -1502,18 +1518,20 @@ void Test_CF_CFDP_DisableEngine(void) /* Test case for: * void CF_CFDP_DisableEngine(void) */ + CF_Engine_t *engine_ptr = CF_GetEngine(); + CF_Channel_t *chan = UT_CFDP_CHANNEL_PTR; /* nominal call */ - CF_AppData.engine.enabled = true; + engine_ptr->enabled = true; UtAssert_VOIDCALL(CF_CFDP_DisableEngine()); - UtAssert_STUB_COUNT(CFE_SB_DeletePipe, CF_NUM_CHANNELS); - UtAssert_BOOL_FALSE(CF_AppData.engine.enabled); + UtAssert_STUB_COUNT(CFE_SB_DeletePipe, 1); + UtAssert_BOOL_FALSE(engine_ptr->enabled); /* nominal call with playbacks and polls active */ - CF_AppData.engine.channels[UT_CFDP_CHANNEL].playback[0].busy = true; - OS_DirectoryOpen(&CF_AppData.engine.channels[UT_CFDP_CHANNEL].playback[0].dir_id, "ut"); - CF_AppData.engine.channels[UT_CFDP_CHANNEL].poll[0].pb.busy = true; - OS_DirectoryOpen(&CF_AppData.engine.channels[UT_CFDP_CHANNEL].poll[0].pb.dir_id, "ut"); + chan->playback[0].busy = true; + OS_DirectoryOpen(&chan->playback[0].dir_id, "ut"); + chan->poll[0].pb.busy = true; + OS_DirectoryOpen(&chan->poll[0].pb.dir_id, "ut"); UtAssert_VOIDCALL(CF_CFDP_DisableEngine()); UtAssert_STUB_COUNT(OS_DirectoryClose, 2); } @@ -1581,29 +1599,30 @@ void Test_CF_CFDP_CheckAckNakCount(void) /* Test Case For: * bool CF_CFDP_CheckAckNakCount(CF_Transaction_t *txn, uint8 *counter) */ - CF_Transaction_t *txn; - CF_ConfigTable_t *config; - uint8 counter; + CF_Transaction_t *txn; + CF_EngineConfig_t *config; + CF_Channel_t *chan; + uint8 counter; - UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, &txn, &config); - config->chan[txn->chan_num].ack_limit = 10; + UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, &txn, &config); + chan->config.ack_limit = 10; counter = 9; UtAssert_BOOL_TRUE(CF_CFDP_CheckAckNakCount(txn, &counter)); UtAssert_UINT8_EQ(counter, 10); - UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, &txn, &config); - counter = config->chan[txn->chan_num].ack_limit; + UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, &txn, &config); + counter = chan->config.ack_limit; txn->history->dir = CF_Direction_RX; UtAssert_BOOL_FALSE(CF_CFDP_CheckAckNakCount(txn, &counter)); - UtAssert_UINT8_EQ(counter, config->chan[txn->chan_num].ack_limit); + UtAssert_UINT8_EQ(counter, chan->config.ack_limit); UT_CF_AssertEventID(CF_CFDP_R_ACK_LIMIT_ERR_EID); - UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, NULL, &txn, &config); - counter = config->chan[txn->chan_num].ack_limit; + UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, &txn, &config); + counter = chan->config.ack_limit; txn->history->dir = CF_Direction_TX; UtAssert_BOOL_FALSE(CF_CFDP_CheckAckNakCount(txn, &counter)); - UtAssert_UINT8_EQ(counter, config->chan[txn->chan_num].ack_limit); + UtAssert_UINT8_EQ(counter, chan->config.ack_limit); UT_CF_AssertEventID(CF_CFDP_S_ACK_LIMIT_ERR_EID); } @@ -1653,32 +1672,32 @@ void Test_CF_CFDP_SetupTxTransaction(void) */ CF_Transaction_t txn; CF_History_t hist; - CF_ConfigTable_t config; CF_CListNode_t *list_ptr; CF_ChunkWrapper_t chunks; + CF_Channel_t *chan = UT_CFDP_CHANNEL_PTR; - memset(&config, 0, sizeof(config)); memset(&chunks, 0, sizeof(chunks)); - CF_AppData.config_table = &config; - list_ptr = NULL; + list_ptr = NULL; UT_SetHandlerFunction(UT_KEY(CF_GetChunkListHead), UT_AltHandler_GenericPointerReturn, &list_ptr); memset(&txn, 0, sizeof(txn)); memset(&hist, 0, sizeof(hist)); - txn.history = &hist; + txn.history = &hist; + txn.chan_ptr = chan; CF_CFDP_SetTxnStatus(&txn, CF_TxnStatus_PROTOCOL_ERROR); - CF_AppData.hk.Payload.channel_hk[txn.chan_num].q_size[txn.flags.com.q_index] = 1; + chan->stat.q_size[txn.flags.com.q_index] = 1; UtAssert_VOIDCALL(CF_CFDP_SetupTxTransaction(&txn)); UtAssert_STUB_COUNT(CF_CFDP_S_Init, 0); memset(&txn, 0, sizeof(txn)); memset(&hist, 0, sizeof(hist)); - txn.chunks = &chunks; - txn.history = &hist; + txn.chunks = &chunks; + txn.history = &hist; + txn.chan_ptr = chan; - CF_AppData.hk.Payload.channel_hk[txn.chan_num].q_size[txn.flags.com.q_index] = 1; + chan->stat.q_size[txn.flags.com.q_index] = 1; UtAssert_VOIDCALL(CF_CFDP_SetupTxTransaction(&txn)); UtAssert_STUB_COUNT(CF_CFDP_S_Init, 1); } @@ -1689,6 +1708,7 @@ void Test_CF_CFDP_TxnStatus(void) /* Check that it is safe to call these routines on a wiped txn */ memset(&txn, 0, sizeof(txn)); + txn.chan_ptr = UT_CFDP_CHANNEL_PTR; UtAssert_VOIDCALL(CF_CFDP_GetTxnStatus(&txn)); UtAssert_VOIDCALL(CF_CFDP_SetTxnStatus(&txn, CF_TxnStatus_ACK_LIMIT_NO_EOF)); } @@ -1702,46 +1722,47 @@ void Test_CF_CFDP_SetupRxTransaction(void) CF_Logical_PduBuffer_t ph; CF_History_t hist; CF_ChunkWrapper_t chunks; + CF_Channel_t *chan = UT_CFDP_CHANNEL_PTR; - CF_ConfigTable_t config; - CF_CListNode_t *list_ptr; + CF_CListNode_t *list_ptr; - memset(&config, 0, sizeof(config)); memset(&ph, 0, sizeof(ph)); memset(&chunks, 0, sizeof(chunks)); - CF_AppData.config_table = &config; - list_ptr = NULL; + list_ptr = NULL; UT_SetHandlerFunction(UT_KEY(CF_GetChunkListHead), UT_AltHandler_GenericPointerReturn, &list_ptr); memset(&txn, 0, sizeof(txn)); memset(&hist, 0, sizeof(hist)); - txn.history = &hist; + txn.history = &hist; + txn.chan_ptr = chan; CF_CFDP_SetTxnStatus(&txn, CF_TxnStatus_PROTOCOL_ERROR); - CF_AppData.hk.Payload.channel_hk[txn.chan_num].q_size[txn.flags.com.q_index] = 1; + chan->stat.q_size[txn.flags.com.q_index] = 1; UtAssert_VOIDCALL(CF_CFDP_SetupRxTransaction(&txn, &ph)); UtAssert_NULL(txn.chunks); UtAssert_UINT32_EQ(txn.state, CF_TxnState_HOLD); memset(&txn, 0, sizeof(txn)); memset(&hist, 0, sizeof(hist)); - txn.history = &hist; - txn.chunks = &chunks; + txn.history = &hist; + txn.chunks = &chunks; + txn.chan_ptr = chan; - CF_AppData.hk.Payload.channel_hk[txn.chan_num].q_size[txn.flags.com.q_index] = 1; - ph.pdu_header.txm_mode = 1; + chan->stat.q_size[txn.flags.com.q_index] = 1; + ph.pdu_header.txm_mode = 1; UtAssert_VOIDCALL(CF_CFDP_SetupRxTransaction(&txn, &ph)); UtAssert_UINT32_EQ(txn.state, CF_TxnState_R1); UtAssert_STUB_COUNT(CF_CFDP_R_Init, 1); memset(&txn, 0, sizeof(txn)); memset(&hist, 0, sizeof(hist)); - txn.history = &hist; - txn.chunks = &chunks; + txn.history = &hist; + txn.chunks = &chunks; + txn.chan_ptr = chan; - CF_AppData.hk.Payload.channel_hk[txn.chan_num].q_size[txn.flags.com.q_index] = 1; - ph.pdu_header.txm_mode = 0; + chan->stat.q_size[txn.flags.com.q_index] = 1; + ph.pdu_header.txm_mode = 0; UtAssert_VOIDCALL(CF_CFDP_SetupRxTransaction(&txn, &ph)); UtAssert_UINT32_EQ(txn.state, CF_TxnState_R2); UtAssert_STUB_COUNT(CF_CFDP_R_Init, 2); @@ -1755,7 +1776,7 @@ void Test_CF_CFDP_ReceivePdu(void) CF_Channel_t *chan; CF_Logical_PduBuffer_t *ph; CF_Transaction_t *txn; - CF_ConfigTable_t *config; + CF_EngineConfig_t *config; CF_ChunkWrapper_t chunk_wrap; memset(&chunk_wrap, 0, sizeof(chunk_wrap)); @@ -1823,7 +1844,7 @@ void Test_CF_CFDP_StartFirstPending(void) chan->qs[CF_QueueIdx_PEND] = &txn->cl_node; /* this dequeues */ - CF_AppData.hk.Payload.channel_hk[txn->chan_num].q_size[txn->flags.com.q_index] = 1; + chan->stat.q_size[txn->flags.com.q_index] = 1; UtAssert_BOOL_TRUE(CF_CFDP_StartFirstPending(chan)); } @@ -1838,28 +1859,25 @@ void Test_CF_CFDP_CompleteTick(void) CF_Channel_t *chan; UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, &txn, NULL); - UT_SetHandlerFunction(UT_KEY(CF_GetChannelFromTxn), UT_AltHandler_GenericPointerReturn, chan); chan->tx_blocked = true; chan->tick_resume = NULL; UtAssert_VOIDCALL(CF_CFDP_CompleteTick(txn)); UtAssert_ADDRESS_EQ(chan->tick_resume, txn); UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, &txn, NULL); - UT_SetHandlerFunction(UT_KEY(CF_GetChannelFromTxn), UT_AltHandler_GenericPointerReturn, chan); chan->tx_blocked = true; chan->tick_resume = &txn2; UtAssert_VOIDCALL(CF_CFDP_CompleteTick(txn)); UtAssert_ADDRESS_EQ(chan->tick_resume, &txn2); UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, &txn, NULL); - UT_SetHandlerFunction(UT_KEY(CF_GetChannelFromTxn), UT_AltHandler_GenericPointerReturn, chan); chan->tx_blocked = false; chan->tick_resume = NULL; UtAssert_VOIDCALL(CF_CFDP_CompleteTick(txn)); UtAssert_NULL(chan->tick_resume); UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, &chan, NULL, &txn, NULL); - UT_ResetState(UT_KEY(CF_GetChannelFromTxn)); + txn->chan_ptr = NULL; chan->tx_blocked = false; chan->tick_resume = NULL; UtAssert_VOIDCALL(CF_CFDP_CompleteTick(txn)); @@ -1871,18 +1889,16 @@ void Test_CF_CFDP_GetTempName(void) /* Test Case For: * void CF_CFDP_GetTempName(const CF_History_t *hist, char *FileNameBuf, size_t FileNameSize) */ - CF_History_t hist; - CF_ConfigTable_t config; - char FileNameBuf[12]; + CF_History_t *hist; + CF_EngineConfig_t *config; + char FileNameBuf[12]; - memset(&hist, 0, sizeof(hist)); - memset(&config, 0, sizeof(config)); + UT_CFDP_SetupBasicTestState(UT_CF_Setup_NONE, NULL, NULL, &hist, NULL, &config); - CF_AppData.config_table = &config; - strcpy(config.tmp_dir, "ut"); - hist.src_eid = 3; - hist.seq_num = 4; - UtAssert_VOIDCALL(CF_CFDP_GetTempName(&hist, FileNameBuf, sizeof(FileNameBuf))); + strcpy(config->tmp_dir, "ut"); + hist->src_eid = 3; + hist->seq_num = 4; + UtAssert_VOIDCALL(CF_CFDP_GetTempName(hist, FileNameBuf, sizeof(FileNameBuf))); UtAssert_STRINGBUF_EQ(FileNameBuf, sizeof(FileNameBuf), "ut/3_4.tmp", -1); } diff --git a/unit-test/cf_cmd_tests.c b/unit-test/cf_cmd_tests.c index fc06f8e2..60b49486 100644 --- a/unit-test/cf_cmd_tests.c +++ b/unit-test/cf_cmd_tests.c @@ -50,14 +50,8 @@ CF_EntityId_t Any_CF_EntityId_t(void) return (CF_EntityId_t)Any_uint8(); } -/* uint8 used for Any_cf_channel likely there will never be that many channels */ -uint8 Any_cf_channel(void) -{ - return Any_uint8_LessThan(CF_NUM_CHANNELS); -} - /* uint8 used for Any_cf_polldir likely there will never be that many polldirs */ -uint8 Any_cf_polldir(void) +CF_PollIdxSelect_t Any_cf_polldir(void) { return Any_uint8_LessThan(CF_MAX_POLLING_DIR_PER_CHAN); } @@ -68,7 +62,7 @@ uint8 Any_bool_arg_t_barg(void) return AnyCoinFlip(); } -uint8 Any_queue_Except_q_pend(void) +CF_QueueSelect_Enum_t Any_queue_Except_q_pend(void) { /* q_pend = 0, q_active = 1, q_history = 2, q_all = 3 */ return (rand() % 2) + 1; /* 0-2, + 1 -> 1-3 */ @@ -91,7 +85,7 @@ typedef struct void *context; } CF_TsnChanAction_fn_t_context_t; -CF_ChanAction_Status_t Chan_action_fn_t(uint8 chan_num, void *context) +CF_ChanAction_Status_t Chan_action_fn_t(CF_Channel_t *chan_ptr, void *context) { /* This one does not need to save its context, just call default so count works */ return UT_DEFAULT_IMPL(Chan_action_fn_t); @@ -125,7 +119,7 @@ void Test_CF_NoopCmd_SendNoopEventAndAcceptCommand(void) uint16 initial_hk_cmd_counter = Any_uint16(); memset(&utbuf, 0, sizeof(utbuf)); - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_NoopCmd(&utbuf); @@ -134,7 +128,7 @@ void Test_CF_NoopCmd_SendNoopEventAndAcceptCommand(void) UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_NOOP_INF_EID); /* Assert to show counter incremented */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); } /******************************************************************************* @@ -146,15 +140,15 @@ void Test_CF_NoopCmd_SendNoopEventAndAcceptCommand(void) void Test_CF_ResetCountersCmd_tests_WhenCommandByteIsEqTo_5_SendEventAndRejectCommand(void) { /* Arrange */ - CF_ResetCountersCmd_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf.Payload; - uint16 initial_hk_err_counter = Any_uint16(); + CF_ResetCountersCmd_t utbuf; + CF_ResetCountersCmd_Payload_t *data = &utbuf.Payload; + uint16 initial_hk_err_counter = Any_uint16(); memset(&utbuf, 0, sizeof(utbuf)); - data->byte[0] = 5; /* 5 is size of 'names' */ + data->ResetType = 5; /* 5 is size of 'names' */ - CF_AppData.hk.Payload.counters.err = initial_hk_err_counter; + CF_AppData.counters.err = initial_hk_err_counter; /* Act */ CF_ResetCountersCmd(&utbuf); @@ -163,21 +157,21 @@ void Test_CF_ResetCountersCmd_tests_WhenCommandByteIsEqTo_5_SendEventAndRejectCo UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CMD_RESET_INVALID_ERR_EID); /* Assert incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); } void Test_CF_ResetCountersCmd_tests_WhenCommandByteIsGreaterThan_5_SendEventAndRejectCommand(void) { /* Arrange */ - CF_ResetCountersCmd_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf.Payload; - uint16 initial_hk_err_counter = Any_uint16(); + CF_ResetCountersCmd_t utbuf; + CF_ResetCountersCmd_Payload_t *data = &utbuf.Payload; + uint16 initial_hk_err_counter = Any_uint16(); memset(&utbuf, 0, sizeof(utbuf)); - data->byte[0] = Any_uint8_GreaterThan(5); /* 5 is size of 'names' */ + data->ResetType = Any_uint8_GreaterThan(5); /* 5 is size of 'names' */ - CF_AppData.hk.Payload.counters.err = initial_hk_err_counter; + CF_AppData.counters.err = initial_hk_err_counter; /* Act */ CF_ResetCountersCmd(&utbuf); @@ -186,20 +180,20 @@ void Test_CF_ResetCountersCmd_tests_WhenCommandByteIsGreaterThan_5_SendEventAndR UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CMD_RESET_INVALID_ERR_EID); /* Assert incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); } void Test_CF_ResetCountersCmd_tests_WhenCommandByteIs_command_AndResetHkCmdAndErrCountSendEvent(void) { /* Arrange */ - CF_ResetCountersCmd_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf.Payload; + CF_ResetCountersCmd_t utbuf; + CF_ResetCountersCmd_Payload_t *data = &utbuf.Payload; memset(&utbuf, 0, sizeof(utbuf)); - data->byte[0] = CF_Reset_command; - CF_AppData.hk.Payload.counters.cmd = Any_uint16_Except(0); - CF_AppData.hk.Payload.counters.err = Any_uint16_Except(0); + data->ResetType = CF_Reset_command; + CF_AppData.counters.cmd = Any_uint16_Except(0); + CF_AppData.counters.err = Any_uint16_Except(0); /* Act */ CF_ResetCountersCmd(&utbuf); @@ -207,240 +201,202 @@ void Test_CF_ResetCountersCmd_tests_WhenCommandByteIs_command_AndResetHkCmdAndEr /* Assert */ UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_RESET_INF_EID); - UtAssert_ZERO(CF_AppData.hk.Payload.counters.cmd); - UtAssert_ZERO(CF_AppData.hk.Payload.counters.err); + UtAssert_ZERO(CF_AppData.counters.cmd); + UtAssert_ZERO(CF_AppData.counters.err); } void Test_CF_ResetCountersCmd_tests_WhenCommandByteIs_fault_ResetAllHkFaultCountSendEventAndAcceptCommand(void) { /* Arrange */ - CF_ResetCountersCmd_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf.Payload; - int i = 0; - uint16 initial_hk_cmd_counter = Any_uint16(); + CF_ResetCountersCmd_t utbuf; + CF_ResetCountersCmd_Payload_t *data = &utbuf.Payload; + uint16 initial_hk_cmd_counter = Any_uint16(); + CF_Channel_t *chan = UT_CFDP_CHANNEL_PTR; memset(&utbuf, 0, sizeof(utbuf)); - data->byte[0] = CF_Reset_fault; + data->ResetType = CF_Reset_fault; - for (i = 0; i < CF_NUM_CHANNELS; ++i) - { - CF_AppData.hk.Payload.channel_hk[i].counters.fault.file_open = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.fault.file_read = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.fault.file_seek = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.fault.file_write = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.fault.file_rename = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.fault.directory_read = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.fault.crc_mismatch = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.fault.file_size_mismatch = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.fault.nak_limit = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.fault.ack_limit = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.fault.inactivity_timer = Any_uint16_Except(0); - } + chan->stat.counters.fault.file_open = Any_uint16_Except(0); + chan->stat.counters.fault.file_read = Any_uint16_Except(0); + chan->stat.counters.fault.file_seek = Any_uint16_Except(0); + chan->stat.counters.fault.file_write = Any_uint16_Except(0); + chan->stat.counters.fault.file_rename = Any_uint16_Except(0); + chan->stat.counters.fault.directory_read = Any_uint16_Except(0); + chan->stat.counters.fault.crc_mismatch = Any_uint16_Except(0); + chan->stat.counters.fault.file_size_mismatch = Any_uint16_Except(0); + chan->stat.counters.fault.nak_limit = Any_uint16_Except(0); + chan->stat.counters.fault.ack_limit = Any_uint16_Except(0); + chan->stat.counters.fault.inactivity_timer = Any_uint16_Except(0); - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_ResetCountersCmd(&utbuf); /* Assert */ UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); + UtAssert_STUB_COUNT(CF_ForEachChannel, 1); UT_CF_AssertEventID(CF_RESET_INF_EID); - for (i = 0; i < CF_NUM_CHANNELS; ++i) - { - UtAssert_ZERO(CF_AppData.hk.Payload.channel_hk[i].counters.fault.file_open); - UtAssert_ZERO(CF_AppData.hk.Payload.channel_hk[i].counters.fault.file_read); - UtAssert_ZERO(CF_AppData.hk.Payload.channel_hk[i].counters.fault.file_seek); - UtAssert_ZERO(CF_AppData.hk.Payload.channel_hk[i].counters.fault.file_write); - UtAssert_ZERO(CF_AppData.hk.Payload.channel_hk[i].counters.fault.file_rename); - UtAssert_ZERO(CF_AppData.hk.Payload.channel_hk[i].counters.fault.directory_read); - UtAssert_ZERO(CF_AppData.hk.Payload.channel_hk[i].counters.fault.crc_mismatch); - UtAssert_ZERO(CF_AppData.hk.Payload.channel_hk[i].counters.fault.file_size_mismatch); - UtAssert_ZERO(CF_AppData.hk.Payload.channel_hk[i].counters.fault.nak_limit); - UtAssert_ZERO(CF_AppData.hk.Payload.channel_hk[i].counters.fault.ack_limit); - UtAssert_ZERO(CF_AppData.hk.Payload.channel_hk[i].counters.fault.inactivity_timer); - UtAssert_MemCmpValue(&CF_AppData.hk.Payload.channel_hk[i].counters.fault, - 0, - sizeof(&CF_AppData.hk.Payload.channel_hk[i].counters.fault), - "fault channel %d was completely cleared to 0", - i); - } + UtAssert_ZERO(chan->stat.counters.fault.file_open); + UtAssert_ZERO(chan->stat.counters.fault.file_read); + UtAssert_ZERO(chan->stat.counters.fault.file_seek); + UtAssert_ZERO(chan->stat.counters.fault.file_write); + UtAssert_ZERO(chan->stat.counters.fault.file_rename); + UtAssert_ZERO(chan->stat.counters.fault.directory_read); + UtAssert_ZERO(chan->stat.counters.fault.crc_mismatch); + UtAssert_ZERO(chan->stat.counters.fault.file_size_mismatch); + UtAssert_ZERO(chan->stat.counters.fault.nak_limit); + UtAssert_ZERO(chan->stat.counters.fault.ack_limit); + UtAssert_ZERO(chan->stat.counters.fault.inactivity_timer); + UtAssert_MemCmpValue(&chan->stat.counters.fault, + 0, + sizeof(&chan->stat.counters.fault), + "fault channel was completely cleared to 0"); /* Assert to show counter incremented */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); } void Test_CF_ResetCountersCmd_tests_WhenCommandByteIs_up_AndResetAllHkRecvCountSendEventAndAcceptCommand(void) { /* Arrange */ - CF_ResetCountersCmd_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf.Payload; - int i = 0; - uint16 initial_hk_cmd_counter = Any_uint16(); + CF_ResetCountersCmd_t utbuf; + CF_ResetCountersCmd_Payload_t *data = &utbuf.Payload; + uint16 initial_hk_cmd_counter = Any_uint16(); + CF_Channel_t *chan = UT_CFDP_CHANNEL_PTR; memset(&utbuf, 0, sizeof(utbuf)); - data->byte[0] = CF_Reset_up; + data->ResetType = CF_Reset_up; - for (i = 0; i < CF_NUM_CHANNELS; ++i) - { - CF_AppData.hk.Payload.channel_hk[i].counters.recv.file_data_bytes = Any_uint64_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.recv.pdu = Any_uint32_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.recv.error = Any_uint32_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.recv.spurious = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.recv.dropped = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.recv.nak_segment_requests = Any_uint32_Except(0); - } + chan->stat.counters.recv.file_data_bytes = Any_uint64_Except(0); + chan->stat.counters.recv.pdu = Any_uint32_Except(0); + chan->stat.counters.recv.error = Any_uint32_Except(0); + chan->stat.counters.recv.spurious = Any_uint16_Except(0); + chan->stat.counters.recv.dropped = Any_uint16_Except(0); + chan->stat.counters.recv.nak_segment_requests = Any_uint32_Except(0); - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_ResetCountersCmd(&utbuf); /* Assert */ UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); + UtAssert_STUB_COUNT(CF_ForEachChannel, 1); UT_CF_AssertEventID(CF_RESET_INF_EID); - for (i = 0; i < CF_NUM_CHANNELS; ++i) - { - UtAssert_ZERO(CF_AppData.hk.Payload.channel_hk[i].counters.recv.file_data_bytes); - UtAssert_ZERO(CF_AppData.hk.Payload.channel_hk[i].counters.recv.pdu); - UtAssert_ZERO(CF_AppData.hk.Payload.channel_hk[i].counters.recv.error); - UtAssert_ZERO(CF_AppData.hk.Payload.channel_hk[i].counters.recv.spurious); - UtAssert_ZERO(CF_AppData.hk.Payload.channel_hk[i].counters.recv.pdu); - UtAssert_ZERO(CF_AppData.hk.Payload.channel_hk[i].counters.recv.nak_segment_requests); - UtAssert_MemCmpValue(&CF_AppData.hk.Payload.channel_hk[i].counters.recv, - 0, - sizeof(&CF_AppData.hk.Payload.channel_hk[i].counters.recv), - "recv channel %d was completely cleared to 0", - i); - } + UtAssert_ZERO(chan->stat.counters.recv.file_data_bytes); + UtAssert_ZERO(chan->stat.counters.recv.pdu); + UtAssert_ZERO(chan->stat.counters.recv.error); + UtAssert_ZERO(chan->stat.counters.recv.spurious); + UtAssert_ZERO(chan->stat.counters.recv.pdu); + UtAssert_ZERO(chan->stat.counters.recv.nak_segment_requests); + UtAssert_MemCmpValue(&chan->stat.counters.recv, + 0, + sizeof(&chan->stat.counters.recv), + "recv channel was completely cleared to 0"); /* Assert to show counter incremented */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); } void Test_CF_ResetCountersCmd_tests_SWhenCommandByteIs_down_AndResetAllHkSentCountendEventAcceptCommand(void) { /* Arrange */ - CF_ResetCountersCmd_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf.Payload; - uint8 i = 0; - uint16 initial_hk_cmd_counter = Any_uint16(); + CF_ResetCountersCmd_t utbuf; + CF_ResetCountersCmd_Payload_t *data = &utbuf.Payload; + uint16 initial_hk_cmd_counter = Any_uint16(); + CF_Channel_t *chan = UT_CFDP_CHANNEL_PTR; memset(&utbuf, 0, sizeof(utbuf)); - data->byte[0] = CF_Reset_down; + data->ResetType = CF_Reset_down; - for (i = 0; i < CF_NUM_CHANNELS; ++i) - { - CF_AppData.hk.Payload.channel_hk[i].counters.sent.file_data_bytes = Any_uint64_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.sent.nak_segment_requests = Any_uint32_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.sent.pdu = Any_uint32_Except(0); - } + chan->stat.counters.sent.file_data_bytes = Any_uint64_Except(0); + chan->stat.counters.sent.nak_segment_requests = Any_uint32_Except(0); + chan->stat.counters.sent.pdu = Any_uint32_Except(0); - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_ResetCountersCmd(&utbuf); /* Assert */ UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); + UtAssert_STUB_COUNT(CF_ForEachChannel, 1); UT_CF_AssertEventID(CF_RESET_INF_EID); - for (i = 0; i < CF_NUM_CHANNELS; ++i) - { - UtAssert_ZERO(CF_AppData.hk.Payload.channel_hk[i].counters.sent.file_data_bytes); - UtAssert_ZERO(CF_AppData.hk.Payload.channel_hk[i].counters.sent.nak_segment_requests); - UtAssert_ZERO(CF_AppData.hk.Payload.channel_hk[i].counters.sent.pdu); - UtAssert_MemCmpValue(&CF_AppData.hk.Payload.channel_hk[i].counters.sent, - 0, - sizeof(&CF_AppData.hk.Payload.channel_hk[i].counters.sent), - "sent channel %d was completely cleared to 0", - i); - } + UtAssert_ZERO(chan->stat.counters.sent.file_data_bytes); + UtAssert_ZERO(chan->stat.counters.sent.nak_segment_requests); + UtAssert_ZERO(chan->stat.counters.sent.pdu); + UtAssert_MemCmpValue(&chan->stat.counters.sent, + 0, + sizeof(&chan->stat.counters.sent), + "sent channel was completely cleared to 0"); /* Assert to show counter incremented */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); } void Test_CF_ResetCountersCmd_tests_WhenCommandByteIs_all_AndResetAllMemValuesSendEvent(void) { /* Arrange */ - CF_ResetCountersCmd_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf.Payload; - int i = 0; + CF_ResetCountersCmd_t utbuf; + CF_ResetCountersCmd_Payload_t *data = &utbuf.Payload; + CF_Channel_t *chan = UT_CFDP_CHANNEL_PTR; memset(&utbuf, 0, sizeof(utbuf)); - data->byte[0] = CF_Reset_all; - - CF_AppData.hk.Payload.counters.cmd = Any_uint16_Except(0); - CF_AppData.hk.Payload.counters.err = Any_uint16_Except(0); - - for (i = 0; i < CF_NUM_CHANNELS; ++i) - { - CF_AppData.hk.Payload.channel_hk[i].counters.fault.file_open = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.fault.file_read = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.fault.file_seek = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.fault.file_write = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.fault.file_rename = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.fault.directory_read = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.fault.crc_mismatch = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.fault.file_size_mismatch = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.fault.nak_limit = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.fault.ack_limit = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.fault.inactivity_timer = Any_uint16_Except(0); - } - - for (i = 0; i < CF_NUM_CHANNELS; ++i) - { - CF_AppData.hk.Payload.channel_hk[i].counters.recv.file_data_bytes = Any_uint64_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.recv.pdu = Any_uint32_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.recv.error = Any_uint32_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.recv.spurious = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.recv.dropped = Any_uint16_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.recv.nak_segment_requests = Any_uint32_Except(0); - } - - for (i = 0; i < CF_NUM_CHANNELS; ++i) - { - CF_AppData.hk.Payload.channel_hk[i].counters.sent.file_data_bytes = Any_uint64_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.sent.nak_segment_requests = Any_uint32_Except(0); - CF_AppData.hk.Payload.channel_hk[i].counters.sent.pdu = Any_uint32_Except(0); - } + data->ResetType = CF_Reset_all; + + CF_AppData.counters.cmd = Any_uint16_Except(0); + CF_AppData.counters.err = Any_uint16_Except(0); + + chan->stat.counters.fault.file_open = Any_uint16_Except(0); + chan->stat.counters.fault.file_read = Any_uint16_Except(0); + chan->stat.counters.fault.file_seek = Any_uint16_Except(0); + chan->stat.counters.fault.file_write = Any_uint16_Except(0); + chan->stat.counters.fault.file_rename = Any_uint16_Except(0); + chan->stat.counters.fault.directory_read = Any_uint16_Except(0); + chan->stat.counters.fault.crc_mismatch = Any_uint16_Except(0); + chan->stat.counters.fault.file_size_mismatch = Any_uint16_Except(0); + chan->stat.counters.fault.nak_limit = Any_uint16_Except(0); + chan->stat.counters.fault.ack_limit = Any_uint16_Except(0); + chan->stat.counters.fault.inactivity_timer = Any_uint16_Except(0); + + chan->stat.counters.recv.file_data_bytes = Any_uint64_Except(0); + chan->stat.counters.recv.pdu = Any_uint32_Except(0); + chan->stat.counters.recv.error = Any_uint32_Except(0); + chan->stat.counters.recv.spurious = Any_uint16_Except(0); + chan->stat.counters.recv.dropped = Any_uint16_Except(0); + chan->stat.counters.recv.nak_segment_requests = Any_uint32_Except(0); + + chan->stat.counters.sent.file_data_bytes = Any_uint64_Except(0); + chan->stat.counters.sent.nak_segment_requests = Any_uint32_Except(0); + chan->stat.counters.sent.pdu = Any_uint32_Except(0); /* Act */ CF_ResetCountersCmd(&utbuf); /* Assert */ UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); + UtAssert_STUB_COUNT(CF_ForEachChannel, 3); UT_CF_AssertEventID(CF_RESET_INF_EID); - UtAssert_ZERO(CF_AppData.hk.Payload.counters.cmd); - UtAssert_ZERO(CF_AppData.hk.Payload.counters.err); - for (i = 0; i < CF_NUM_CHANNELS; ++i) - { - UtAssert_MemCmpValue(&CF_AppData.hk.Payload.channel_hk[i].counters.fault, - 0, - sizeof(&CF_AppData.hk.Payload.channel_hk[i].counters.fault), - "fault channel %d was completely cleared to 0", - i); - } - for (i = 0; i < CF_NUM_CHANNELS; ++i) - { - UtAssert_MemCmpValue(&CF_AppData.hk.Payload.channel_hk[i].counters.recv, - 0, - sizeof(&CF_AppData.hk.Payload.channel_hk[i].counters.recv), - "recv channel %d was completely cleared to 0", - i); - } - for (i = 0; i < CF_NUM_CHANNELS; ++i) - { - UtAssert_MemCmpValue(&CF_AppData.hk.Payload.channel_hk[i].counters.sent, - 0, - sizeof(&CF_AppData.hk.Payload.channel_hk[i].counters.sent), - "sent channel %d was completely cleared to 0", - i); - } + UtAssert_ZERO(CF_AppData.counters.cmd); + UtAssert_ZERO(CF_AppData.counters.err); + UtAssert_MemCmpValue(&chan->stat.counters.fault, + 0, + sizeof(&chan->stat.counters.fault), + "fault channel was completely cleared to 0"); + UtAssert_MemCmpValue(&chan->stat.counters.recv, + 0, + sizeof(&chan->stat.counters.recv), + "recv channel was completely cleared to 0"); + UtAssert_MemCmpValue(&chan->stat.counters.sent, + 0, + sizeof(&chan->stat.counters.sent), + "sent channel was completely cleared to 0"); } /******************************************************************************* @@ -457,21 +413,21 @@ void Test_CF_TxFileCmd(void) CF_TxFileCmd_t utbuf; CF_TxFile_Payload_t *msg = &utbuf.Payload; - memset(&CF_AppData.hk.Payload.counters, 0, sizeof(CF_AppData.hk.Payload.counters)); + memset(&CF_AppData.counters, 0, sizeof(CF_AppData.counters)); /* nominal, all zero should pass checks, just calls CF_CFDP_TxFile */ memset(msg, 0, sizeof(*msg)); - msg->cfdp_class = CF_CFDP_CLASS_1; + msg->cfdp_class = CF_CFDP_Class_1; UtAssert_VOIDCALL(CF_TxFileCmd(&utbuf)); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, 1); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CMD_TX_FILE_INF_EID); UT_CF_ResetEventCapture(); memset(msg, 0, sizeof(*msg)); - msg->cfdp_class = CF_CFDP_CLASS_2; + msg->cfdp_class = CF_CFDP_Class_2; UtAssert_VOIDCALL(CF_TxFileCmd(&utbuf)); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, 2); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, 2); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CMD_TX_FILE_INF_EID); @@ -481,14 +437,14 @@ void Test_CF_TxFileCmd(void) msg->cfdp_class = 10; UtAssert_VOIDCALL(CF_TxFileCmd(&utbuf)); UT_CF_AssertEventID(CF_CMD_BAD_PARAM_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 1); UT_CF_ResetEventCapture(); memset(msg, 0, sizeof(*msg)); msg->cfdp_class = -10; UtAssert_VOIDCALL(CF_TxFileCmd(&utbuf)); UT_CF_AssertEventID(CF_CMD_BAD_PARAM_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 2); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 2); /* out of range arguments: bad channel */ UT_CF_ResetEventCapture(); @@ -496,7 +452,7 @@ void Test_CF_TxFileCmd(void) msg->chan_num = CF_NUM_CHANNELS; UtAssert_VOIDCALL(CF_TxFileCmd(&utbuf)); UT_CF_AssertEventID(CF_CMD_BAD_PARAM_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 3); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 3); /* out of range arguments: bad keep */ UT_CF_ResetEventCapture(); @@ -504,7 +460,7 @@ void Test_CF_TxFileCmd(void) msg->keep = 15; UtAssert_VOIDCALL(CF_TxFileCmd(&utbuf)); UT_CF_AssertEventID(CF_CMD_BAD_PARAM_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 4); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 4); /* CF_CFDP_TxFile fails*/ UT_CF_ResetEventCapture(); @@ -512,7 +468,7 @@ void Test_CF_TxFileCmd(void) memset(msg, 0, sizeof(*msg)); UtAssert_VOIDCALL(CF_TxFileCmd(&utbuf)); UT_CF_AssertEventID(CF_CMD_TX_FILE_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 5); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 5); } /******************************************************************************* @@ -529,32 +485,32 @@ void Test_CF_PlaybackDirCmd(void) CF_PlaybackDirCmd_t utbuf; CF_TxFile_Payload_t *msg = &utbuf.Payload; - memset(&CF_AppData.hk.Payload.counters, 0, sizeof(CF_AppData.hk.Payload.counters)); + memset(&CF_AppData.counters, 0, sizeof(CF_AppData.counters)); /* nominal, all zero should pass checks, just calls CF_CFDP_PlaybackDir */ memset(msg, 0, sizeof(*msg)); - msg->cfdp_class = CF_CFDP_CLASS_1; + msg->cfdp_class = CF_CFDP_Class_1; UtAssert_VOIDCALL(CF_PlaybackDirCmd(&utbuf)); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, 1); memset(msg, 0, sizeof(*msg)); - msg->cfdp_class = CF_CFDP_CLASS_2; + msg->cfdp_class = CF_CFDP_Class_2; UtAssert_VOIDCALL(CF_PlaybackDirCmd(&utbuf)); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, 2); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, 2); /* out of range arguments: bad class */ memset(msg, 0, sizeof(*msg)); msg->cfdp_class = 10; UtAssert_VOIDCALL(CF_PlaybackDirCmd(&utbuf)); UT_CF_AssertEventID(CF_CMD_BAD_PARAM_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 1); UT_CF_ResetEventCapture(); memset(msg, 0, sizeof(*msg)); msg->cfdp_class = -10; UtAssert_VOIDCALL(CF_PlaybackDirCmd(&utbuf)); UT_CF_AssertEventID(CF_CMD_BAD_PARAM_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 2); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 2); /* out of range arguments: bad channel */ UT_CF_ResetEventCapture(); @@ -562,7 +518,7 @@ void Test_CF_PlaybackDirCmd(void) msg->chan_num = CF_NUM_CHANNELS; UtAssert_VOIDCALL(CF_PlaybackDirCmd(&utbuf)); UT_CF_AssertEventID(CF_CMD_BAD_PARAM_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 3); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 3); /* out of range arguments: bad keep */ UT_CF_ResetEventCapture(); @@ -570,7 +526,7 @@ void Test_CF_PlaybackDirCmd(void) msg->keep = 15; UtAssert_VOIDCALL(CF_PlaybackDirCmd(&utbuf)); UT_CF_AssertEventID(CF_CMD_BAD_PARAM_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 4); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 4); /* CF_CFDP_PlaybackDir fails*/ UT_CF_ResetEventCapture(); @@ -578,7 +534,7 @@ void Test_CF_PlaybackDirCmd(void) memset(msg, 0, sizeof(*msg)); UtAssert_VOIDCALL(CF_PlaybackDirCmd(&utbuf)); UT_CF_AssertEventID(CF_CMD_PLAYBACK_DIR_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 5); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 5); } /******************************************************************************* @@ -590,29 +546,22 @@ void Test_CF_PlaybackDirCmd(void) void Test_CF_DoChanAction_CF_ALL_CHANNELS_WhenAny_fn_returns_1_Return_1(void) { /* Arrange */ - CF_UnionArgs_Payload_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf; - const char *arg_errstr = "CANNOT TEST SENT TO SEND EVENT"; - CF_ChanActionFn_t arg_fn = &Chan_action_fn_t; - int context; - void *arg_context = &context; - uint8 random_fn_call = Any_uint8_LessThan(CF_NUM_CHANNELS) + 1; - CF_ChanAction_Status_t local_result; - - memset(&utbuf, 0, sizeof(utbuf)); + CF_ChannelSelect_t data; + const char *arg_errstr = "CANNOT TEST SENT TO SEND EVENT"; + CF_ChanActionFn_t arg_fn = &Chan_action_fn_t; + int context; + void *arg_context = &context; + CF_ChanAction_Status_t local_result; - data->byte[0] = CF_ALL_CHANNELS; + data = CF_ALL_CHANNELS; - UT_SetDeferredRetcode(UT_KEY(Chan_action_fn_t), random_fn_call, 1); + UT_SetDeferredRetcode(UT_KEY(Chan_action_fn_t), 1, 1); /* Act */ local_result = CF_DoChanAction(data, arg_errstr, arg_fn, arg_context); - UT_GetStubCount(UT_KEY(Chan_action_fn_t)); - UT_GetStubCount(UT_KEY(CFE_EVS_SendEvent)); - /* Assert */ - UtAssert_STUB_COUNT(Chan_action_fn_t, CF_NUM_CHANNELS); + UtAssert_STUB_COUNT(Chan_action_fn_t, 1); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 0); UtAssert_INT32_EQ(local_result, CF_ChanAction_Status_SUCCESS | 1); } @@ -620,28 +569,22 @@ void Test_CF_DoChanAction_CF_ALL_CHANNELS_WhenAny_fn_returns_1_Return_1(void) void Test_CF_DoChanAction_CF_ALL_CHANNELS_WhenAll_fn_return_1_Return_1(void) { /* Arrange */ - CF_UnionArgs_Payload_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf; - const char *arg_errstr = "CANNOT TEST SENT TO SEND EVENT"; - CF_ChanActionFn_t arg_fn = &Chan_action_fn_t; - int context; - void *arg_context = &context; - CF_ChanAction_Status_t local_result; - - memset(&utbuf, 0, sizeof(utbuf)); + CF_ChannelSelect_t data; + const char *arg_errstr = "CANNOT TEST SENT TO SEND EVENT"; + CF_ChanActionFn_t arg_fn = &Chan_action_fn_t; + int context; + void *arg_context = &context; + CF_ChanAction_Status_t local_result; - data->byte[0] = CF_ALL_CHANNELS; + data = CF_ALL_CHANNELS; UT_SetDefaultReturnValue(UT_KEY(Chan_action_fn_t), 1); /* Act */ local_result = CF_DoChanAction(data, arg_errstr, arg_fn, arg_context); - UT_GetStubCount(UT_KEY(Chan_action_fn_t)); - UT_GetStubCount(UT_KEY(CFE_EVS_SendEvent)); - /* Assert */ - UtAssert_STUB_COUNT(Chan_action_fn_t, CF_NUM_CHANNELS); + UtAssert_STUB_COUNT(Chan_action_fn_t, 1); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 0); UtAssert_INT32_EQ(local_result, CF_ChanAction_Status_SUCCESS | 1); } @@ -649,28 +592,22 @@ void Test_CF_DoChanAction_CF_ALL_CHANNELS_WhenAll_fn_return_1_Return_1(void) void Test_CF_DoChanAction_CF_ALL_CHANNELS_WhenNo_fn_returns_0_Return_0(void) { /* Arrange */ - CF_UnionArgs_Payload_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf; - const char *arg_errstr = "CANNOT TEST SENT TO SEND EVENT"; - CF_ChanActionFn_t arg_fn = &Chan_action_fn_t; - int context; - void *arg_context = &context; - CF_ChanAction_Status_t local_result; - - memset(&utbuf, 0, sizeof(utbuf)); + CF_ChannelSelect_t data; + const char *arg_errstr = "CANNOT TEST SENT TO SEND EVENT"; + CF_ChanActionFn_t arg_fn = &Chan_action_fn_t; + int context; + void *arg_context = &context; + CF_ChanAction_Status_t local_result; - data->byte[0] = CF_ALL_CHANNELS; + data = CF_ALL_CHANNELS; UT_SetDefaultReturnValue(UT_KEY(Chan_action_fn_t), 0); /* Act */ local_result = CF_DoChanAction(data, arg_errstr, arg_fn, arg_context); - UT_GetStubCount(UT_KEY(Chan_action_fn_t)); - UT_GetStubCount(UT_KEY(CFE_EVS_SendEvent)); - /* Assert */ - UtAssert_STUB_COUNT(Chan_action_fn_t, CF_NUM_CHANNELS); + UtAssert_STUB_COUNT(Chan_action_fn_t, 1); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 0); UtAssert_INT32_EQ(local_result, CF_ChanAction_Status_SUCCESS); } @@ -678,26 +615,20 @@ void Test_CF_DoChanAction_CF_ALL_CHANNELS_WhenNo_fn_returns_0_Return_0(void) void Test_CF_DoChanAction_WhenChannel_fn_ActionReturns_1_Return_1(void) { /* Arrange */ - CF_UnionArgs_Payload_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf; - const char *arg_errstr = "CANNOT TEST SENT TO SEND EVENT"; - CF_ChanActionFn_t arg_fn = &Chan_action_fn_t; - int context; - void *arg_context = &context; - CF_ChanAction_Status_t local_result; - - memset(&utbuf, 0, sizeof(utbuf)); + CF_ChannelSelect_t data; + const char *arg_errstr = "CANNOT TEST SENT TO SEND EVENT"; + CF_ChanActionFn_t arg_fn = &Chan_action_fn_t; + int context; + void *arg_context = &context; + CF_ChanAction_Status_t local_result; - data->byte[0] = Any_cf_channel(); + data = Any_cf_chan_num(); UT_SetDefaultReturnValue(UT_KEY(Chan_action_fn_t), 1); /* Act */ local_result = CF_DoChanAction(data, arg_errstr, arg_fn, arg_context); - UT_GetStubCount(UT_KEY(Chan_action_fn_t)); - UT_GetStubCount(UT_KEY(CFE_EVS_SendEvent)); - /* Assert */ UtAssert_STUB_COUNT(Chan_action_fn_t, 1); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 0); @@ -707,26 +638,20 @@ void Test_CF_DoChanAction_WhenChannel_fn_ActionReturns_1_Return_1(void) void Test_CF_DoChanAction_WhenChannel_fn_ActionReturns_0_Return_1(void) { /* Arrange */ - CF_UnionArgs_Payload_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf; - const char *arg_errstr = "CANNOT TEST SENT TO SEND EVENT"; - CF_ChanActionFn_t arg_fn = &Chan_action_fn_t; - int context; - void *arg_context = &context; - CF_ChanAction_Status_t local_result; - - memset(&utbuf, 0, sizeof(utbuf)); + CF_ChannelSelect_t data; + const char *arg_errstr = "CANNOT TEST SENT TO SEND EVENT"; + CF_ChanActionFn_t arg_fn = &Chan_action_fn_t; + int context; + void *arg_context = &context; + CF_ChanAction_Status_t local_result; - data->byte[0] = Any_cf_channel(); + data = Any_cf_chan_num(); UT_SetDefaultReturnValue(UT_KEY(Chan_action_fn_t), 0); /* Act */ local_result = CF_DoChanAction(data, arg_errstr, arg_fn, arg_context); - UT_GetStubCount(UT_KEY(Chan_action_fn_t)); - UT_GetStubCount(UT_KEY(CFE_EVS_SendEvent)); - /* Assert */ UtAssert_STUB_COUNT(Chan_action_fn_t, 1); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 0); @@ -736,24 +661,18 @@ void Test_CF_DoChanAction_WhenChannel_fn_ActionReturns_0_Return_1(void) void Test_CF_DoChanAction_WhenChanNumberEq_CF_NUM_CHANNELS_Return_neg1_And_SendEvent_(void) { /* Arrange */ - CF_UnionArgs_Payload_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf; - const char *arg_errstr = "CANNOT TEST SENT TO SEND EVENT"; - CF_ChanActionFn_t arg_fn = &Chan_action_fn_t; - int context; - void *arg_context = &context; - CF_ChanAction_Status_t local_result; - - memset(&utbuf, 0, sizeof(utbuf)); + CF_ChannelSelect_t data; + const char *arg_errstr = "CANNOT TEST SENT TO SEND EVENT"; + CF_ChanActionFn_t arg_fn = &Chan_action_fn_t; + int context; + void *arg_context = &context; + CF_ChanAction_Status_t local_result; - data->byte[0] = CF_NUM_CHANNELS; + data = CF_NUM_CHANNELS; /* Act */ local_result = CF_DoChanAction(data, arg_errstr, arg_fn, arg_context); - UT_GetStubCount(UT_KEY(Chan_action_fn_t)); - UT_GetStubCount(UT_KEY(CFE_EVS_SendEvent)); - /* Assert */ UtAssert_STUB_COUNT(Chan_action_fn_t, 0); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); @@ -765,39 +684,19 @@ void Test_CF_DoChanAction_WhenChanNumberEq_CF_NUM_CHANNELS_Return_neg1_And_SendE void Test_CF_DoChanAction_WhenBadChannelNumber_Return_neg1_And_SendEvent(void) { /* Arrange */ - CF_UnionArgs_Payload_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf; - const char *arg_errstr = "CANNOT TEST SENT TO SEND EVENT"; - CF_ChanActionFn_t arg_fn = &Chan_action_fn_t; - int context; - void *arg_context = &context; - CF_ChanAction_Status_t local_result; - int catastrophe_count = 0; - - memset(&utbuf, 0, sizeof(utbuf)); + CF_ChannelSelect_t data; + const char *arg_errstr = "CANNOT TEST SENT TO SEND EVENT"; + CF_ChanActionFn_t arg_fn = &Chan_action_fn_t; + int context; + void *arg_context = &context; + CF_ChanAction_Status_t local_result; /* force CF_ALL_CHANNELS to not be a selection possibility */ - data->byte[0] = CF_ALL_CHANNELS; - while (data->byte[0] == CF_ALL_CHANNELS) - { - if (catastrophe_count == 10) /* 10 is arbitrary */ - { - UtAssert_Message(UTASSERT_CASETYPE_ABORT, - __FILE__, - __LINE__, - "CANNOT make data->byte[0] != CF_ALL_CHANNELS in 10 tries"); - } - - data->byte[0] = Any_uint8_GreaterThan_or_EqualTo(CF_NUM_CHANNELS); - ++catastrophe_count; - } + data = CF_ALL_CHANNELS - 2; /* Act */ local_result = CF_DoChanAction(data, arg_errstr, arg_fn, arg_context); - UT_GetStubCount(UT_KEY(Chan_action_fn_t)); - UT_GetStubCount(UT_KEY(CFE_EVS_SendEvent)); - /* Assert */ UtAssert_STUB_COUNT(Chan_action_fn_t, 0); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); @@ -815,7 +714,7 @@ void Test_CF_DoChanAction_WhenBadChannelNumber_Return_neg1_And_SendEvent(void) void Test_CF_DoFreezeThaw_Set_frozen_ToGiven_context_barg_AndReturn_0(void) { /* Arrange */ - uint8 arg_chan_num = Any_cf_channel(); + CF_Channel_t *chan = UT_CFDP_CHANNEL_PTR; CF_ChanAction_BoolArg_t context; CF_ChanAction_Status_t local_result; @@ -823,15 +722,15 @@ void Test_CF_DoFreezeThaw_Set_frozen_ToGiven_context_barg_AndReturn_0(void) /* set frozen to opposite to ensure change was done - not required for test, * but it is helpful for verification that the function did the change */ - CF_AppData.hk.Payload.channel_hk[arg_chan_num].frozen = !context.barg; + chan->stat.frozen = !context.barg; /* Act */ - local_result = CF_DoFreezeThaw(arg_chan_num, &context); + local_result = CF_DoFreezeThaw(chan, &context); /* Assert */ - UtAssert_True(CF_AppData.hk.Payload.channel_hk[arg_chan_num].frozen == context.barg, + UtAssert_True(chan->stat.frozen == context.barg, "CF_DoFreezeThaw set frozen to %d and should be %d (context->barg))", - CF_AppData.hk.Payload.channel_hk[arg_chan_num].frozen, + chan->stat.frozen, context.barg); UtAssert_INT32_EQ(local_result, CF_ChanAction_Status_SUCCESS); } @@ -845,31 +744,31 @@ void Test_CF_DoFreezeThaw_Set_frozen_ToGiven_context_barg_AndReturn_0(void) void Test_CF_FreezeCmd_Set_frozen_To_1_AndAcceptCommand(void) { /* Arrange */ - CF_FreezeCmd_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf.Payload; - uint16 initial_hk_cmd_counter = Any_uint16(); - - /* Arrange unstubbable: CF_DoFreezeThaw via CF_DoChanAction */ - uint8 chan_num = Any_cf_channel(); + CF_FreezeCmd_t utbuf; + CF_ChannelSelect_Payload_t *data = &utbuf.Payload; + uint16 initial_hk_cmd_counter = Any_uint16(); + CF_Channel_t *chan; memset(&utbuf, 0, sizeof(utbuf)); /* Arrange unstubbable: CF_DoChanAction */ - data->byte[0] = chan_num; + data->ChannelSelect = Any_cf_chan_num(); + chan = CF_GetChannelPtr(data->ChannelSelect); + chan->stat.frozen = false; - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_FreezeCmd(&utbuf); /* Assert */ /* Assert for CF_DoFreezeThaw */ - UtAssert_True(CF_AppData.hk.Payload.channel_hk[chan_num].frozen == 1, + UtAssert_True(chan->stat.frozen == 1, "CF_DoFreezeThaw set frozen to %d and should be 1 (freeze = 1))", - CF_AppData.hk.Payload.channel_hk[chan_num].frozen); - UtAssert_True(CF_AppData.hk.Payload.counters.cmd == (uint16)(initial_hk_cmd_counter + 1), - "CF_AppData.hk.Payload.counters.cmd is %d and should be 1 more than %d", - CF_AppData.hk.Payload.counters.cmd, + chan->stat.frozen); + UtAssert_True(CF_AppData.counters.cmd == (uint16)(initial_hk_cmd_counter + 1), + "CF_AppData.counters.cmd is %d and should be 1 more than %d", + CF_AppData.counters.cmd, initial_hk_cmd_counter); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CMD_FREEZE_INF_EID); @@ -878,23 +777,23 @@ void Test_CF_FreezeCmd_Set_frozen_To_1_AndAcceptCommand(void) void Test_CF_FreezeCmd_Set_frozen_To_1_AndRejectCommand(void) { /* Arrange */ - CF_FreezeCmd_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf.Payload; + CF_FreezeCmd_t utbuf; + CF_ChannelSelect_Payload_t *data = &utbuf.Payload; /* Arrange unstubbable: CF_DoFreezeThaw via CF_DoChanAction */ memset(&utbuf, 0, sizeof(utbuf)); /* Arrange unstubbable: CF_DoChanAction */ - data->byte[0] = CF_NUM_CHANNELS + 1; + data->ChannelSelect = CF_NUM_CHANNELS + 1; - CF_AppData.hk.Payload.counters.cmd = 0; + CF_AppData.counters.cmd = 0; /* Act */ CF_FreezeCmd(&utbuf); /* Assert */ /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 1); UT_CF_AssertEventID(CF_CMD_FREEZE_ERR_EID); } @@ -907,31 +806,32 @@ void Test_CF_FreezeCmd_Set_frozen_To_1_AndRejectCommand(void) void Test_CF_ThawCmd_Set_frozen_To_0_AndAcceptCommand(void) { /* Arrange */ - CF_ThawCmd_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf.Payload; - uint16 initial_hk_cmd_counter = Any_uint16(); + CF_ThawCmd_t utbuf; + CF_ChannelSelect_Payload_t *data = &utbuf.Payload; + uint16 initial_hk_cmd_counter = Any_uint16(); /* Arrange unstubbable: CF_DoFreezeThaw via CF_DoChanAction */ - uint8 chan_num = Any_cf_channel(); + CF_Channel_t *chan; memset(&utbuf, 0, sizeof(utbuf)); /* Arrange unstubbable: CF_DoChanAction */ - data->byte[0] = chan_num; + data->ChannelSelect = Any_cf_chan_num(); + chan = CF_GetChannelPtr(data->ChannelSelect); - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_ThawCmd(&utbuf); /* Assert */ /* Assert for CF_DoFreezeThaw */ - UtAssert_True(CF_AppData.hk.Payload.channel_hk[chan_num].frozen == 0, + UtAssert_True(chan->stat.frozen == 0, "CF_DoFreezeThaw set frozen to %d and should be 0 (thaw = 0))", - CF_AppData.hk.Payload.channel_hk[chan_num].frozen); - UtAssert_True(CF_AppData.hk.Payload.counters.cmd == (uint16)(initial_hk_cmd_counter + 1), - "CF_AppData.hk.Payload.counters.cmd is %d and should be 1 more than %d", - CF_AppData.hk.Payload.counters.cmd, + chan->stat.frozen); + UtAssert_True(CF_AppData.counters.cmd == (uint16)(initial_hk_cmd_counter + 1), + "CF_AppData.counters.cmd is %d and should be 1 more than %d", + CF_AppData.counters.cmd, initial_hk_cmd_counter); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CMD_THAW_INF_EID); @@ -940,23 +840,23 @@ void Test_CF_ThawCmd_Set_frozen_To_0_AndAcceptCommand(void) void Test_CF_ThawCmd_Set_frozen_To_0_AndRejectCommand(void) { /* Arrange */ - CF_ThawCmd_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf.Payload; + CF_ThawCmd_t utbuf; + CF_ChannelSelect_Payload_t *data = &utbuf.Payload; /* Arrange unstubbable: CF_DoFreezeThaw via CF_DoChanAction */ memset(&utbuf, 0, sizeof(utbuf)); /* Arrange unstubbable: CF_DoChanAction */ - data->byte[0] = CF_NUM_CHANNELS + 1; + data->ChannelSelect = CF_NUM_CHANNELS + 1; - CF_AppData.hk.Payload.counters.cmd = 0; + CF_AppData.counters.cmd = 0; /* Act */ CF_ThawCmd(&utbuf); /* Assert */ /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 1); UT_CF_AssertEventID(CF_CMD_THAW_ERR_EID); } @@ -973,6 +873,7 @@ void Test_CF_FindTransactionBySequenceNumberAllChannels_WhenNoTransactionFoundRe CF_EntityId_t arg_eid = Any_CF_EntityId_t(); CF_Transaction_t *local_result; CF_Transaction_t *expected_result = NULL; + CF_Engine_t *engine_ptr = CF_GetEngine(); CF_FindTransactionBySequenceNumber_context_t context_CF_CFDP_FTBSN; @@ -986,11 +887,9 @@ void Test_CF_FindTransactionBySequenceNumberAllChannels_WhenNoTransactionFoundRe /* Act */ local_result = CF_FindTransactionBySequenceNumberAllChannels(arg_ts, arg_eid); - UT_GetStubCount(UT_KEY(CF_FindTransactionBySequenceNumber)); - /* Assert */ UtAssert_STUB_COUNT(CF_FindTransactionBySequenceNumber, CF_NUM_CHANNELS); - UtAssert_ADDRESS_EQ(context_CF_CFDP_FTBSN.chan, CF_AppData.engine.channels); + UtAssert_ADDRESS_EQ(context_CF_CFDP_FTBSN.chan, engine_ptr->channels); UtAssert_UINT32_EQ(context_CF_CFDP_FTBSN.transaction_sequence_number, arg_ts); UtAssert_UINT32_EQ(context_CF_CFDP_FTBSN.src_eid, arg_eid); UtAssert_ADDRESS_EQ(local_result, expected_result); @@ -1025,17 +924,15 @@ void Test_CF_FindTransactionBySequenceNumberAllChannels_Return_TransactionFound( /* Act */ local_result = CF_FindTransactionBySequenceNumberAllChannels(arg_ts, arg_eid); - UT_GetStubCount(UT_KEY(CF_FindTransactionBySequenceNumber)); - /* Assert */ UtAssert_STUB_COUNT(CF_FindTransactionBySequenceNumber, number_transaction_match + 1); for (i = 0; i < number_transaction_match; ++i) { - UtAssert_ADDRESS_EQ(contexts_CF_CFDP_FTBSN[i].chan, CF_AppData.engine.channels + i); + UtAssert_ADDRESS_EQ(contexts_CF_CFDP_FTBSN[i].chan, CF_GetChannelPtr(CF_ChannelSelect_FromInt(i))); UtAssert_UINT32_EQ(contexts_CF_CFDP_FTBSN[i].transaction_sequence_number, arg_ts); UtAssert_UINT32_EQ(contexts_CF_CFDP_FTBSN[i].src_eid, arg_eid); } - UtAssert_ADDRESS_EQ(contexts_CF_CFDP_FTBSN[i].chan, CF_AppData.engine.channels + i); + UtAssert_ADDRESS_EQ(contexts_CF_CFDP_FTBSN[i].chan, CF_GetChannelPtr(CF_ChannelSelect_FromInt(i))); UtAssert_UINT32_EQ(contexts_CF_CFDP_FTBSN[i].transaction_sequence_number, arg_ts); UtAssert_UINT32_EQ(contexts_CF_CFDP_FTBSN[i].src_eid, arg_eid); UtAssert_ADDRESS_EQ(local_result, expected_result); @@ -1065,7 +962,7 @@ void Test_CF_TsnChanAction_SendEvent_cmd_chan_Eq_CF_COMPOUND_KEY_TransactionNotF AnyRandomStringOfLettersOfLengthCopy(cmdstr, 10); memcpy((char *)arg_cmdstr, &cmdstr, 10); - arg_cmd->chan = CF_COMPOUND_KEY; + arg_cmd->chan_num = CF_COMPOUND_KEY; /* Arrange unstubbable: CF_FindTransactionBySequenceNumberAllChannels */ /* set non-matching transactions */ @@ -1082,8 +979,6 @@ void Test_CF_TsnChanAction_SendEvent_cmd_chan_Eq_CF_COMPOUND_KEY_TransactionNotF /* Act */ UtAssert_INT32_EQ(CF_TsnChanAction(arg_cmd, arg_cmdstr, arg_fn, arg_context), -1); - UT_GetStubCount(UT_KEY(Dummy_CF_TsnChanAction_fn_t)); - /* Assert */ UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CMD_TRANS_NOT_FOUND_ERR_EID); @@ -1108,7 +1003,7 @@ void Test_CF_TsnChanAction_cmd_chan_Eq_CF_COMPOUND_KEY_TransactionFoundRun_fn_An AnyRandomStringOfLettersOfLengthCopy(cmdstr, 10); memcpy((char *)arg_cmdstr, &cmdstr, 10); - arg_cmd->chan = CF_COMPOUND_KEY; + arg_cmd->chan_num = CF_COMPOUND_KEY; UT_SetDataBuffer(UT_KEY(Dummy_CF_TsnChanAction_fn_t), &context_CF_TsnChanAction_fn_t, @@ -1129,8 +1024,6 @@ void Test_CF_TsnChanAction_cmd_chan_Eq_CF_COMPOUND_KEY_TransactionFoundRun_fn_An /* Act */ UtAssert_INT32_EQ(CF_TsnChanAction(arg_cmd, arg_cmdstr, arg_fn, arg_context), 1); - UT_GetStubCount(UT_KEY(Dummy_CF_TsnChanAction_fn_t)); - /* Assert */ UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 0); UtAssert_STUB_COUNT(Dummy_CF_TsnChanAction_fn_t, 1); @@ -1157,7 +1050,7 @@ void Test_CF_TsnChanAction_cmd_chan_Eq_CF_ALL_CHANNELS_Return_CF_TraverseAllTran context_CF_TATAC.forced_return = expected_result; - arg_cmd->chan = CF_ALL_CHANNELS; + arg_cmd->chan_num = CF_ALL_CHANNELS; UT_SetDataBuffer(UT_KEY(CF_TraverseAllTransactions_All_Channels), &context_CF_TATAC, @@ -1200,7 +1093,7 @@ void Test_CF_TsnChanAction_cmd_FailBecause_cmd_chan_IsInvalid(void) void *arg_context = &context; memset(&utbuf, 0, sizeof(utbuf)); - arg_cmd->chan = Any_uint8_BetweenExcludeMax(CF_NUM_CHANNELS, CF_COMPOUND_KEY); + arg_cmd->chan_num = CF_NUM_CHANNELS + 1; /* Act */ UtAssert_INT32_EQ(CF_TsnChanAction(arg_cmd, arg_cmdstr, arg_fn, arg_context), -1); @@ -1296,7 +1189,7 @@ void Test_CF_DoSuspRes(void) CF_Transaction_Payload_t *cmd = &utbuf; CF_ChanAction_SuspResArg_t utargs; - memset(&CF_AppData.hk.Payload.counters, 0, sizeof(CF_AppData.hk.Payload.counters)); + memset(&CF_AppData.counters, 0, sizeof(CF_AppData.counters)); memset(&utargs, 0, sizeof(utargs)); memset(cmd, 0, sizeof(*cmd)); @@ -1304,7 +1197,7 @@ void Test_CF_DoSuspRes(void) /* With no setup, CF_TsnChanAction() invokes CF_TraverseAllTransactions stub, which returns 0 */ /* this should increment the reject counter because it did not match any transactions */ UtAssert_VOIDCALL(CF_DoSuspRes(cmd, 0)); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 1); /* set up to match 1 transaction, should be accepted, but should not generate an event */ UT_CF_ResetEventCapture(); @@ -1312,7 +1205,7 @@ void Test_CF_DoSuspRes(void) UtAssert_VOIDCALL(CF_DoSuspRes(cmd, 1)); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CMD_SUSPRES_INF_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, 1); /* Output the CF_ChanAction_SuspResArg_t back to the caller, to set the "same" flag to 1 */ /* this gets the case where it attempts to set to the same value, and is rejected due to that */ @@ -1324,7 +1217,7 @@ void Test_CF_DoSuspRes(void) &utargs); UtAssert_VOIDCALL(CF_DoSuspRes(cmd, 0)); UT_CF_AssertEventID(CF_CMD_SUSPRES_SAME_INF_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, 2); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, 2); /* Output the CF_ChanAction_SuspResArg_t back to the caller, to set the "same" flag to 1 */ /* however this time CF_TraverseAllTransactions reports it matched multiple transactions, so it should NOT reject it @@ -1334,7 +1227,7 @@ void Test_CF_DoSuspRes(void) UtAssert_VOIDCALL(CF_DoSuspRes(cmd, 1)); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CMD_SUSPRES_INF_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, 3); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, 3); } /******************************************************************************* @@ -1352,7 +1245,7 @@ void Test_CF_SuspendCmd_Call_CF_DoSuspRes_WithGiven_msg_And_action_1(void) memset(&utbuf, 0, sizeof(utbuf)); /* Set to invalid channel */ - utbuf.Payload.chan = CF_NUM_CHANNELS; + utbuf.Payload.chan_num = CF_NUM_CHANNELS; /* Act */ CF_SuspendCmd(&utbuf); @@ -1363,7 +1256,7 @@ void Test_CF_SuspendCmd_Call_CF_DoSuspRes_WithGiven_msg_And_action_1(void) UtAssert_UINT32_EQ(UT_CF_CapturedEventIDs[1], CF_CMD_SUSPRES_CHAN_ERR_EID); /* Assert incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 1); } /******************************************************************************* @@ -1380,7 +1273,7 @@ void Test_CF_ResumeCmd_Call_CF_DoSuspRes_WithGiven_msg_And_action_0(void) memset(&utbuf, 0, sizeof(utbuf)); /* Invalid channel */ - utbuf.Payload.chan = CF_NUM_CHANNELS; + utbuf.Payload.chan_num = CF_NUM_CHANNELS; /* Act */ CF_ResumeCmd(&utbuf); @@ -1391,7 +1284,7 @@ void Test_CF_ResumeCmd_Call_CF_DoSuspRes_WithGiven_msg_And_action_0(void) UtAssert_UINT32_EQ(UT_CF_CapturedEventIDs[1], CF_CMD_SUSPRES_CHAN_ERR_EID); /* Assert incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 1); } /******************************************************************************* @@ -1440,7 +1333,7 @@ void Test_CF_CancelCmd_Success(void) /* Assert */ UtAssert_STUB_COUNT(CF_TraverseAllTransactions, 1); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, 1); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CMD_CANCEL_INF_EID); } @@ -1459,7 +1352,7 @@ void Test_CF_CancelCmd_Failure(void) /* Assert */ UtAssert_STUB_COUNT(CF_TraverseAllTransactions, 1); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 1); UT_CF_AssertEventID(CF_CMD_CANCEL_CHAN_ERR_EID); } @@ -1503,7 +1396,7 @@ void Test_CF_AbandonCmd_Success(void) /* Assert */ UtAssert_STUB_COUNT(CF_TraverseAllTransactions, 1); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, 1); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CMD_ABANDON_INF_EID); } @@ -1522,7 +1415,7 @@ void Test_CF_AbandonCmd_Failure(void) /* Assert */ UtAssert_STUB_COUNT(CF_TraverseAllTransactions, 1); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 1); UT_CF_AssertEventID(CF_CMD_ABANDON_CHAN_ERR_EID); } @@ -1535,24 +1428,21 @@ void Test_CF_AbandonCmd_Failure(void) void Test_CF_DoEnableDisableDequeue_Set_chan_num_EnabledFlagTo_context_barg(void) { /* Arrange */ - CF_ConfigTable_t config_table; - uint8 arg_chan_num = Any_cf_channel(); + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); CF_ChanAction_BoolArg_t context; CF_ChanAction_BoolArg_t *arg_context = &context; + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); - CF_AppData.config_table = &config_table; - context.barg = Any_bool_arg_t_barg(); - - memset(&config_table, 0, sizeof(config_table)); + context.barg = Any_bool_arg_t_barg(); /* Act */ - CF_DoEnableDisableDequeue(arg_chan_num, arg_context); + CF_DoEnableDisableDequeue(chan, arg_context); /* Assert */ - UtAssert_True(CF_AppData.config_table->chan[arg_chan_num].dequeue_enabled == context.barg, + UtAssert_True(chan->config.dequeue_enabled == context.barg, "Channel %u dequeue_enabled is %u and should be %u (context->barg)", - arg_chan_num, - CF_AppData.config_table->chan[arg_chan_num].dequeue_enabled, + CF_ChannelSelect_AsInt(chan_num), + chan->config.dequeue_enabled, context.barg); } @@ -1567,38 +1457,34 @@ void Test_CF_EnableDequeueCmd_Success(void) CF_EnableDequeueCmd_t utbuf; /* Arrange */ - CF_UnionArgs_Payload_t *data = &utbuf.Payload; - uint16 initial_hk_cmd_counter = Any_uint16(); + CF_ChannelSelect_Payload_t *data = &utbuf.Payload; + uint16 initial_hk_cmd_counter = Any_uint16(); /* Arrange unstubbable: CF_DoEnableDisableDequeue via CF_DoChanAction */ - CF_ConfigTable_t config_table; - uint8 chan_num = Any_cf_channel(); + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); memset(&utbuf, 0, sizeof(utbuf)); - memset(&config_table, 0, sizeof(config_table)); - - CF_AppData.config_table = &config_table; /* Arrange unstubbable: CF_DoChanAction */ - data->byte[0] = chan_num; + data->ChannelSelect = chan_num; - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_EnableDequeueCmd(&utbuf); /* Assert */ /* Assert for CF_DoFreezeThaw */ - UtAssert_True(CF_AppData.config_table->chan[chan_num].dequeue_enabled == 1, + UtAssert_True(chan->config.dequeue_enabled == 1, "CF_EnableDequeueCmd set dequeue_enabled to %d and should be 1 (barg = 1))", - CF_AppData.config_table->chan[chan_num].dequeue_enabled); + chan->config.dequeue_enabled); /* Assert for incremented counter */ - UtAssert_True( - CF_AppData.hk.Payload.counters.cmd == (uint16)(initial_hk_cmd_counter + 1), - "CF_AppData.hk.Payload.counters.cmd is %d and should be 1 more than %d\nACCEPTANCE OF COMMAND (+1) SHOULD BE " - "THE BEHAVIOR BUT IT IS NOT", - CF_AppData.hk.Payload.counters.cmd, - initial_hk_cmd_counter); + UtAssert_True(CF_AppData.counters.cmd == (uint16)(initial_hk_cmd_counter + 1), + "CF_AppData.counters.cmd is %d and should be 1 more than %d\nACCEPTANCE OF COMMAND (+1) SHOULD BE " + "THE BEHAVIOR BUT IT IS NOT", + CF_AppData.counters.cmd, + initial_hk_cmd_counter); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CMD_ENABLE_DEQUEUE_INF_EID); } @@ -1608,27 +1494,21 @@ void Test_CF_EnableDequeueCmd_Failure(void) /* Arrange */ CF_EnableDequeueCmd_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf.Payload; - - /* Arrange unstubbable: CF_DoEnableDisableDequeue via CF_DoChanAction */ - CF_ConfigTable_t config_table; + CF_ChannelSelect_Payload_t *data = &utbuf.Payload; memset(&utbuf, 0, sizeof(utbuf)); - memset(&config_table, 0, sizeof(config_table)); - - CF_AppData.config_table = &config_table; /* Arrange unstubbable: CF_DoChanAction */ - data->byte[0] = CF_NUM_CHANNELS + 1; + data->ChannelSelect = CF_NUM_CHANNELS + 1; - CF_AppData.hk.Payload.counters.err = 0; + CF_AppData.counters.err = 0; /* Act */ CF_EnableDequeueCmd(&utbuf); /* Assert */ /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 1); UT_CF_AssertEventID(CF_CMD_ENABLE_DEQUEUE_ERR_EID); } @@ -1642,35 +1522,31 @@ void Test_CF_DisableDequeueCmd_Success(void) { CF_DisableDequeueCmd_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf.Payload; - uint16 initial_hk_cmd_counter = Any_uint16(); + CF_ChannelSelect_Payload_t *data = &utbuf.Payload; + uint16 initial_hk_cmd_counter = Any_uint16(); - /* Arrange unstubbable: CF_DoEnableDisableDequeue via CF_DoChanAction */ - CF_ConfigTable_t config_table; - uint8 chan_num = Any_cf_channel(); + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); memset(&utbuf, 0, sizeof(utbuf)); - memset(&config_table, 0, sizeof(config_table)); - - CF_AppData.config_table = &config_table; /* Arrange unstubbable: CF_DoChanAction */ - data->byte[0] = chan_num; + data->ChannelSelect = chan_num; - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_DisableDequeueCmd(&utbuf); /* Assert */ /* Assert for CF_DoFreezeThaw */ - UtAssert_True(CF_AppData.config_table->chan[chan_num].dequeue_enabled == 0, + UtAssert_True(chan->config.dequeue_enabled == 0, "CF_EnableDequeueCmd set dequeue_enabled to %d and should be 0 (barg = 0))", - CF_AppData.config_table->chan[chan_num].dequeue_enabled); + chan->config.dequeue_enabled); /* Assert for incremented counter */ - UtAssert_True(CF_AppData.hk.Payload.counters.cmd == (uint16)(initial_hk_cmd_counter + 1), - "CF_AppData.hk.Payload.counters.cmd is %d and should be 1 more than %d", - CF_AppData.hk.Payload.counters.cmd, + UtAssert_True(CF_AppData.counters.cmd == (uint16)(initial_hk_cmd_counter + 1), + "CF_AppData.counters.cmd is %d and should be 1 more than %d", + CF_AppData.counters.cmd, initial_hk_cmd_counter); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CMD_DISABLE_DEQUEUE_INF_EID); @@ -1681,27 +1557,21 @@ void Test_CF_DisableDequeueCmd_Failure(void) /* Arrange */ CF_DisableDequeueCmd_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf.Payload; - - /* Arrange unstubbable: CF_DoEnableDisableDequeue via CF_DoChanAction */ - CF_ConfigTable_t config_table; + CF_ChannelSelect_Payload_t *data = &utbuf.Payload; memset(&utbuf, 0, sizeof(utbuf)); - memset(&config_table, 0, sizeof(config_table)); - - CF_AppData.config_table = &config_table; /* Arrange unstubbable: CF_DoChanAction */ - data->byte[0] = CF_NUM_CHANNELS + 1; + data->ChannelSelect = CF_NUM_CHANNELS + 1; - CF_AppData.hk.Payload.counters.err = 0; + CF_AppData.counters.err = 0; /* Act */ CF_DisableDequeueCmd(&utbuf); /* Assert */ /* Assert for CF_DoFreezeThaw */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 1); UT_CF_AssertEventID(CF_CMD_DISABLE_DEQUEUE_ERR_EID); } @@ -1714,38 +1584,35 @@ void Test_CF_DisableDequeueCmd_Failure(void) void Test_CF_DoEnableDisablePolldir_When_CF_ALL_CHANNELS_SetAllPolldirsInChannelEnabledTo_context_barg(void) { /* Arrange */ - CF_UnionArgs_Payload_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf; + CF_PollDirSelect_Payload_t utbuf; + CF_PollDirSelect_Payload_t *data = &utbuf; CF_ChanAction_BoolMsgArg_t context; CF_ChanAction_BoolMsgArg_t *arg_context = &context; - CF_ConfigTable_t config_table; - uint8 arg_chan_num = Any_cf_channel(); + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); uint8 expected_enabled; uint8 current_polldir = 0; CF_ChanAction_Status_t local_result; + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); memset(&utbuf, 0, sizeof(utbuf)); - memset(&config_table, 0, sizeof(config_table)); - CF_AppData.config_table = &config_table; + data->PollDirIndx = CF_ALL_POLLDIRS; - data->byte[1] = CF_ALL_CHANNELS; - - context.data = data; - context.barg = Any_bool_arg_t_barg(); - expected_enabled = context.barg; + context.opaque_data = data; + context.barg = Any_bool_arg_t_barg(); + expected_enabled = context.barg; /* Act */ - local_result = CF_DoEnableDisablePolldir(arg_chan_num, arg_context); + local_result = CF_DoEnableDisablePolldir(chan, arg_context); /* Assert */ for (current_polldir = 0; current_polldir < CF_MAX_POLLING_DIR_PER_CHAN; ++current_polldir) { - UtAssert_True(CF_AppData.config_table->chan[arg_chan_num].polldir[current_polldir].enabled == expected_enabled, + UtAssert_True(chan->config.polldir[current_polldir].enabled == expected_enabled, "Channel %u Polldir %u set to %u and should be %u (context->barg)", - arg_chan_num, + CF_ChannelSelect_AsInt(chan_num), current_polldir, - CF_AppData.config_table->chan[arg_chan_num].polldir[current_polldir].enabled, + chan->config.polldir[current_polldir].enabled, expected_enabled); } UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 0); @@ -1755,36 +1622,33 @@ void Test_CF_DoEnableDisablePolldir_When_CF_ALL_CHANNELS_SetAllPolldirsInChannel void Test_CF_DoEnableDisablePolldir_WhenSetToSpecificPolldirSetPolldirFrom_context_ChannelEnabledTo_context_barg(void) { /* Arrange */ - uint8 arg_chan_num = Any_cf_channel(); - uint8 polldir = Any_cf_polldir(); - CF_UnionArgs_Payload_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf; + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + uint8 polldir = Any_cf_polldir(); + CF_PollDirSelect_Payload_t utbuf; + CF_PollDirSelect_Payload_t *data = &utbuf; CF_ChanAction_BoolMsgArg_t context; CF_ChanAction_BoolMsgArg_t *arg_context = &context; - CF_ConfigTable_t config_table; uint8 expected_enabled; CF_ChanAction_Status_t local_result; + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); memset(&utbuf, 0, sizeof(utbuf)); - memset(&config_table, 0, sizeof(config_table)); - - CF_AppData.config_table = &config_table; - data->byte[1] = polldir; + data->PollDirIndx = polldir; - context.data = data; - context.barg = Any_bool_arg_t_barg(); - expected_enabled = context.barg; + context.opaque_data = data; + context.barg = Any_bool_arg_t_barg(); + expected_enabled = context.barg; /* Act */ - local_result = CF_DoEnableDisablePolldir(arg_chan_num, arg_context); + local_result = CF_DoEnableDisablePolldir(chan, arg_context); /* Assert */ - UtAssert_True(CF_AppData.config_table->chan[arg_chan_num].polldir[polldir].enabled == expected_enabled, + UtAssert_True(chan->config.polldir[polldir].enabled == expected_enabled, "Channel %u Polldir %u set to %u and should be %u (context->barg)", - arg_chan_num, + CF_ChannelSelect_AsInt(chan_num), polldir, - CF_AppData.config_table->chan[arg_chan_num].polldir[polldir].enabled, + chan->config.polldir[polldir].enabled, expected_enabled); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 0); UtAssert_INT32_EQ(local_result, CF_ChanAction_Status_SUCCESS); @@ -1793,25 +1657,23 @@ void Test_CF_DoEnableDisablePolldir_WhenSetToSpecificPolldirSetPolldirFrom_conte void Test_CF_DoEnableDisablePolldir_FailPolldirEq_CF_MAX_POLLING_DIR_PER_CHAN_AndSendEvent(void) { /* Arrange */ - uint8 arg_chan_num = Any_cf_channel(); - CF_UnionArgs_Payload_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf; + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + CF_PollDirSelect_Payload_t utbuf; + CF_PollDirSelect_Payload_t *data = &utbuf; CF_ChanAction_BoolMsgArg_t context; CF_ChanAction_BoolMsgArg_t *arg_context = &context; - CF_ConfigTable_t config_table; CF_ChanAction_Status_t local_result; + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); memset(&utbuf, 0, sizeof(utbuf)); - CF_AppData.config_table = &config_table; + data->PollDirIndx = CF_MAX_POLLING_DIR_PER_CHAN; - data->byte[1] = CF_MAX_POLLING_DIR_PER_CHAN; - - context.data = data; - context.barg = Any_bool_arg_t_barg(); + context.opaque_data = data; + context.barg = Any_bool_arg_t_barg(); /* Act */ - local_result = CF_DoEnableDisablePolldir(arg_chan_num, arg_context); + local_result = CF_DoEnableDisablePolldir(chan, arg_context); /* Assert */ UT_CF_AssertEventID(CF_CMD_POLLDIR_INVALID_ERR_EID); @@ -1822,25 +1684,23 @@ void Test_CF_DoEnableDisablePolldir_FailPolldirEq_CF_MAX_POLLING_DIR_PER_CHAN_An void Test_CF_DoEnableDisablePolldir_FailAnyBadPolldirSendEvent(void) { /* Arrange */ - uint8 arg_chan_num = Any_cf_channel(); - CF_UnionArgs_Payload_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf; + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + CF_PollDirSelect_Payload_t utbuf; + CF_PollDirSelect_Payload_t *data = &utbuf; CF_ChanAction_BoolMsgArg_t context; CF_ChanAction_BoolMsgArg_t *arg_context = &context; - CF_ConfigTable_t config_table; CF_ChanAction_Status_t local_result; + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); memset(&utbuf, 0, sizeof(utbuf)); - CF_AppData.config_table = &config_table; + data->PollDirIndx = CF_MAX_POLLING_DIR_PER_CHAN; - data->byte[1] = CF_MAX_POLLING_DIR_PER_CHAN; - - context.data = data; - context.barg = Any_bool_arg_t_barg(); + context.opaque_data = data; + context.barg = Any_bool_arg_t_barg(); /* Act */ - local_result = CF_DoEnableDisablePolldir(arg_chan_num, arg_context); + local_result = CF_DoEnableDisablePolldir(chan, arg_context); /* Assert */ UT_CF_AssertEventID(CF_CMD_POLLDIR_INVALID_ERR_EID); @@ -1857,42 +1717,39 @@ void Test_CF_DoEnableDisablePolldir_FailAnyBadPolldirSendEvent(void) void Test_CF_EnablePolldirCmd_SuccessWhenActionSuccess(void) { /* Arrange */ - CF_ConfigTable_t config_table; - uint8 channel = Any_cf_channel(); - uint8 polldir = Any_cf_polldir(); + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + uint8 polldir = Any_cf_polldir(); + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); CF_EnableDirPollingCmd_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf.Payload; - uint16 initial_hk_cmd_counter = Any_uint16(); + CF_PollDirSelect_Payload_t *data = &utbuf.Payload; + uint16 initial_hk_cmd_counter = Any_uint16(); memset(&utbuf, 0, sizeof(utbuf)); - memset(&config_table, 0, sizeof(config_table)); - - CF_AppData.config_table = &config_table; /* Arrange unstubbable: CF_DoChanAction */ - data->byte[0] = channel; + data->ChannelSelect = chan_num; /* Arrange unstubbable: CF_DoEnableDisablePolldir */ - data->byte[1] = polldir; + data->PollDirIndx = polldir; - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_EnableDirPollingCmd(&utbuf); /* Assert */ /* Assert for CF_DoEnableDisablePolldir */ - UtAssert_True(CF_AppData.config_table->chan[channel].polldir[polldir].enabled == 1, + UtAssert_True(chan->config.polldir[polldir].enabled == 1, "Channel %u Polldir %u set to %u and should be 1 (context->barg)", - channel, + CF_ChannelSelect_AsInt(chan_num), polldir, - CF_AppData.config_table->chan[channel].polldir[polldir].enabled); + chan->config.polldir[polldir].enabled); /* Assert for incremented counter */ - UtAssert_True(CF_AppData.hk.Payload.counters.cmd == (uint16)(initial_hk_cmd_counter + 1), - "CF_AppData.hk.Payload.counters.cmd is %d and should be 1 more than %d", - CF_AppData.hk.Payload.counters.cmd, + UtAssert_True(CF_AppData.counters.cmd == (uint16)(initial_hk_cmd_counter + 1), + "CF_AppData.counters.cmd is %d and should be 1 more than %d", + CF_AppData.counters.cmd, initial_hk_cmd_counter); UT_CF_AssertEventID(CF_CMD_ENABLE_POLLDIR_INF_EID); } @@ -1900,21 +1757,22 @@ void Test_CF_EnablePolldirCmd_SuccessWhenActionSuccess(void) void Test_CF_EnablePolldirCmd_FailWhenActionFail(void) { /* Arrange */ - uint8 channel = Any_cf_channel(); - uint8 error_polldir = Any_uint8_BetweenInclusive(CF_MAX_POLLING_DIR_PER_CHAN, CF_ALL_CHANNELS - 1); + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + uint8 error_polldir = Any_uint8_BetweenInclusive(CF_MAX_POLLING_DIR_PER_CHAN, CF_ALL_CHANNELS - 1); - CF_EnableDirPollingCmd_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf.Payload; - uint16 initial_hk_err_counter = Any_uint16(); + CF_EnableDirPollingCmd_t utbuf; + CF_PollDirSelect_Payload_t *data = &utbuf.Payload; + uint16 initial_hk_err_counter = Any_uint16(); memset(&utbuf, 0, sizeof(utbuf)); /* Arrange unstubbable: CF_DoChanAction */ - data->byte[0] = channel; + data->ChannelSelect = chan_num; /* Arrange unstubbable: CF_DoEnableDisablePolldir */ - data->byte[1] = error_polldir; - CF_AppData.hk.Payload.counters.err = initial_hk_err_counter; + data->PollDirIndx = error_polldir; + + CF_AppData.counters.err = initial_hk_err_counter; /* Act */ CF_EnableDirPollingCmd(&utbuf); @@ -1922,9 +1780,9 @@ void Test_CF_EnablePolldirCmd_FailWhenActionFail(void) /* Assert */ /* Assert for CF_DoEnableDisablePolldir */ /* Assert for incremented counter */ - UtAssert_True(CF_AppData.hk.Payload.counters.err == (uint16)(initial_hk_err_counter + 1), - "CF_AppData.hk.Payload.counters.err is %d and should be 1 more than %d", - CF_AppData.hk.Payload.counters.err, + UtAssert_True(CF_AppData.counters.err == (uint16)(initial_hk_err_counter + 1), + "CF_AppData.counters.err is %d and should be 1 more than %d", + CF_AppData.counters.err, initial_hk_err_counter); UT_CF_AssertEventID(CF_CMD_ENABLE_POLLDIR_ERR_EID); } @@ -1938,41 +1796,38 @@ void Test_CF_EnablePolldirCmd_FailWhenActionFail(void) void Test_CF_DisablePolldirCmd_SuccessWhenActionSuccess(void) { /* Arrange */ - CF_ConfigTable_t config_table; - uint8 channel = Any_cf_channel(); - uint8 polldir = Any_cf_polldir(); + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + uint8 polldir = Any_cf_polldir(); - CF_DisableDirPollingCmd_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf.Payload; - uint16 initial_hk_cmd_counter = Any_uint16(); + CF_DisableDirPollingCmd_t utbuf; + CF_PollDirSelect_Payload_t *data = &utbuf.Payload; + uint16 initial_hk_cmd_counter = Any_uint16(); + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); memset(&utbuf, 0, sizeof(utbuf)); - memset(&config_table, 0, sizeof(config_table)); - - CF_AppData.config_table = &config_table; /* Arrange unstubbable: CF_DoChanAction */ - data->byte[0] = channel; + data->ChannelSelect = chan_num; /* Arrange unstubbable: CF_DoEnableDisablePolldir */ - data->byte[1] = polldir; + data->PollDirIndx = polldir; - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_DisableDirPollingCmd(&utbuf); /* Assert */ /* Assert for CF_DoEnableDisablePolldir */ - UtAssert_True(CF_AppData.config_table->chan[channel].polldir[polldir].enabled == 0, + UtAssert_True(chan->config.polldir[polldir].enabled == 0, "Channel %u Polldir %u set to %u and should be 0 (context->barg)", - channel, + CF_ChannelSelect_AsInt(chan_num), polldir, - CF_AppData.config_table->chan[channel].polldir[polldir].enabled); + chan->config.polldir[polldir].enabled); /* Assert for incremented counter */ - UtAssert_True(CF_AppData.hk.Payload.counters.cmd == (uint16)(initial_hk_cmd_counter + 1), - "CF_AppData.hk.Payload.counters.cmd is %d and should be 1 more than %d", - CF_AppData.hk.Payload.counters.cmd, + UtAssert_True(CF_AppData.counters.cmd == (uint16)(initial_hk_cmd_counter + 1), + "CF_AppData.counters.cmd is %d and should be 1 more than %d", + CF_AppData.counters.cmd, initial_hk_cmd_counter); UT_CF_AssertEventID(CF_CMD_DISABLE_POLLDIR_INF_EID); } @@ -1980,22 +1835,22 @@ void Test_CF_DisablePolldirCmd_SuccessWhenActionSuccess(void) void Test_CF_DisablePolldirCmd_FailWhenActionFail(void) { /* Arrange */ - uint8 channel = Any_cf_channel(); - uint8 error_polldir = Any_uint8_BetweenInclusive(CF_MAX_POLLING_DIR_PER_CHAN, CF_ALL_CHANNELS - 1); + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + uint8 error_polldir = Any_uint8_BetweenInclusive(CF_MAX_POLLING_DIR_PER_CHAN, CF_ALL_CHANNELS - 1); - CF_DisableDirPollingCmd_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf.Payload; - uint16 initial_hk_err_counter = Any_uint16(); + CF_DisableDirPollingCmd_t utbuf; + CF_PollDirSelect_Payload_t *data = &utbuf.Payload; + uint16 initial_hk_err_counter = Any_uint16(); memset(&utbuf, 0, sizeof(utbuf)); /* Arrange unstubbable: CF_DoChanAction */ - data->byte[0] = channel; + data->ChannelSelect = chan_num; /* Arrange unstubbable: CF_DoEnableDisablePolldir */ - data->byte[1] = error_polldir; + data->PollDirIndx = error_polldir; - CF_AppData.hk.Payload.counters.err = initial_hk_err_counter; + CF_AppData.counters.err = initial_hk_err_counter; /* Act */ CF_DisableDirPollingCmd(&utbuf); @@ -2003,9 +1858,9 @@ void Test_CF_DisablePolldirCmd_FailWhenActionFail(void) /* Assert */ /* Assert for CF_DoEnableDisablePolldir */ /* Assert for incremented counter*/ - UtAssert_True(CF_AppData.hk.Payload.counters.err == (uint16)(initial_hk_err_counter + 1), - "CF_AppData.hk.Payload.counters.err is %d and should be 1 more than %d", - CF_AppData.hk.Payload.counters.err, + UtAssert_True(CF_AppData.counters.err == (uint16)(initial_hk_err_counter + 1), + "CF_AppData.counters.err is %d and should be 1 more than %d", + CF_AppData.counters.err, initial_hk_err_counter); UT_CF_AssertEventID(CF_CMD_DISABLE_POLLDIR_ERR_EID); } @@ -2073,11 +1928,11 @@ void Test_CF_PurgeTransaction_Call_CF_CFDP_ResetTransaction_AndReturn_CLIST_CONT void Test_CF_DoPurgeQueue_PendOnly(void) { /* Arrange */ - uint8 arg_chan_num = Any_cf_channel(); - CF_UnionArgs_Payload_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf; + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + CF_QueueSelect_Payload_t utbuf; + CF_QueueSelect_Payload_t *data = &utbuf; CF_ChanAction_MsgArg_t msgarg = { data }; - CF_Channel_t *chan; + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); CF_CListNode_t start; CF_CListNode_t *expected_start = &start; CF_ChanAction_Status_t local_result; @@ -2085,18 +1940,16 @@ void Test_CF_DoPurgeQueue_PendOnly(void) memset(&utbuf, 0, sizeof(utbuf)); - data->byte[1] = 0; /* pend */ + data->ChannelSelect = chan_num; + data->QueueSelect = CF_QueueSelect_Pending; /* pend */ UT_SetHandlerFunction(UT_KEY(CF_CList_Traverse), UT_AltHandler_CF_CList_Traverse_POINTER, &context_CF_CList_Traverse); - chan = &CF_AppData.engine.channels[arg_chan_num]; chan->qs[CF_QueueIdx_PEND] = expected_start; /* Act */ - local_result = CF_DoPurgeQueue(arg_chan_num, &msgarg); - - UT_GetStubCount(UT_KEY(CF_CList_Traverse)); + local_result = CF_DoPurgeQueue(chan, &msgarg); /* Assert */ UtAssert_STUB_COUNT(CF_CList_Traverse, 1); @@ -2110,11 +1963,11 @@ void Test_CF_DoPurgeQueue_PendOnly(void) void Test_CF_DoPurgeQueue_HistoryOnly(void) { /* Arrange */ - uint8 arg_chan_num = Any_cf_channel(); - CF_UnionArgs_Payload_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf; + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + CF_QueueSelect_Payload_t utbuf; + CF_QueueSelect_Payload_t *data = &utbuf; CF_ChanAction_MsgArg_t msgarg = { data }; - CF_Channel_t *chan; + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); CF_CListNode_t start; CF_CListNode_t *expected_start = &start; CF_ChanAction_Status_t local_result; @@ -2122,20 +1975,18 @@ void Test_CF_DoPurgeQueue_HistoryOnly(void) memset(&utbuf, 0, sizeof(utbuf)); - data->byte[1] = 1; /* history */ + data->ChannelSelect = chan_num; + data->QueueSelect = CF_QueueSelect_History; /* history */ /* set correct context type for CF_CList_Traverse stub */ UT_SetHandlerFunction(UT_KEY(CF_CList_Traverse), UT_AltHandler_CF_CList_Traverse_POINTER, &context_CF_CList_Traverse); - chan = &CF_AppData.engine.channels[arg_chan_num]; chan->qs[CF_QueueIdx_HIST] = expected_start; /* Act */ - local_result = CF_DoPurgeQueue(arg_chan_num, &msgarg); - - UT_GetStubCount(UT_KEY(CF_CList_Traverse)); + local_result = CF_DoPurgeQueue(chan, &msgarg); /* Assert */ UtAssert_STUB_COUNT(CF_CList_Traverse, 1); @@ -2149,11 +2000,11 @@ void Test_CF_DoPurgeQueue_HistoryOnly(void) void Test_CF_DoPurgeQueue_Both(void) { /* Arrange */ - uint8 arg_chan_num = Any_cf_channel(); - CF_UnionArgs_Payload_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf; + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + CF_QueueSelect_Payload_t utbuf; + CF_QueueSelect_Payload_t *data = &utbuf; CF_ChanAction_MsgArg_t msgarg = { data }; - CF_Channel_t *chan; + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); CF_CListNode_t pend_start; CF_CListNode_t *expected_pend_start = &pend_start; CF_CListNode_t history_start; @@ -2163,21 +2014,19 @@ void Test_CF_DoPurgeQueue_Both(void) memset(&utbuf, 0, sizeof(utbuf)); - data->byte[1] = 2; /* both */ + data->ChannelSelect = chan_num; + data->QueueSelect = CF_QueueSelect_All; /* both */ /* set correct context type for CF_CList_Traverse stub */ /* this must use data buffer hack to pass multiple contexts */ UT_SetHandlerFunction(UT_KEY(CF_CList_Traverse), UT_AltHandler_CF_CList_Traverse_POINTER, NULL); UT_SetDataBuffer(UT_KEY(CF_CList_Traverse), context_CF_CList_Traverse, sizeof(context_CF_CList_Traverse), false); - chan = &CF_AppData.engine.channels[arg_chan_num]; chan->qs[CF_QueueIdx_PEND] = expected_pend_start; chan->qs[CF_QueueIdx_HIST] = expected_history_start; /* Act */ - local_result = CF_DoPurgeQueue(arg_chan_num, &msgarg); - - UT_GetStubCount(UT_KEY(CF_CList_Traverse)); + local_result = CF_DoPurgeQueue(chan, &msgarg); /* Assert */ UtAssert_STUB_COUNT(CF_CList_Traverse, 2); @@ -2195,20 +2044,20 @@ void Test_CF_DoPurgeQueue_Both(void) void Test_CF_DoPurgeQueue_GivenBad_data_byte_1_SendEventAndReturn_neg1(void) { /* Arrange */ - uint8 arg_chan_num = Any_cf_channel(); - CF_UnionArgs_Payload_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf; - CF_ChanAction_MsgArg_t msgarg = { data }; - CF_ChanAction_Status_t local_result; + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + CF_QueueSelect_Payload_t utbuf; + CF_QueueSelect_Payload_t *data = &utbuf; + CF_ChanAction_MsgArg_t msgarg = { data }; + CF_ChanAction_Status_t local_result; + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); memset(&utbuf, 0, sizeof(utbuf)); - data->byte[1] = 3; /* 3 is first default value */ + data->ChannelSelect = chan_num; + data->QueueSelect = 10; /* Invalid */ /* Act */ - local_result = CF_DoPurgeQueue(arg_chan_num, &msgarg); - - UT_GetStubCount(UT_KEY(CF_CList_Traverse)); + local_result = CF_DoPurgeQueue(chan, &msgarg); /* Assert */ UtAssert_INT32_EQ(local_result, CF_ChanAction_Status_ERROR); @@ -2220,20 +2069,20 @@ void Test_CF_DoPurgeQueue_GivenBad_data_byte_1_SendEventAndReturn_neg1(void) void Test_CF_DoPurgeQueue_AnyGivenBad_data_byte_1_SendEventAndReturn_neg1(void) { /* Arrange */ - uint8 arg_chan_num = Any_cf_channel(); - CF_UnionArgs_Payload_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf; - CF_ChanAction_MsgArg_t msgarg = { data }; - CF_ChanAction_Status_t local_result; + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + CF_QueueSelect_Payload_t utbuf; + CF_QueueSelect_Payload_t *data = &utbuf; + CF_ChanAction_MsgArg_t msgarg = { data }; + CF_ChanAction_Status_t local_result; + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); memset(&utbuf, 0, sizeof(utbuf)); - data->byte[1] = Any_uint8_GreaterThan_or_EqualTo(3); + data->ChannelSelect = chan_num; + data->QueueSelect = Any_uint8_GreaterThan(CF_QueueSelect_All); /* Act */ - local_result = CF_DoPurgeQueue(arg_chan_num, &msgarg); - - UT_GetStubCount(UT_KEY(CF_CList_Traverse)); + local_result = CF_DoPurgeQueue(chan, &msgarg); /* Assert */ UtAssert_INT32_EQ(local_result, CF_ChanAction_Status_ERROR); @@ -2251,21 +2100,21 @@ void Test_CF_DoPurgeQueue_AnyGivenBad_data_byte_1_SendEventAndReturn_neg1(void) void Test_CF_PurgeQueueCmd_FailWhenActionFail(void) { /* Arrange */ - uint8 channel = Any_cf_channel(); - uint8 error_purge = 3; /* Shortest return from CF_DoPurgeQueue */ - CF_PurgeQueueCmd_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf.Payload; - uint16 initial_hk_err_counter = Any_uint16(); + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + uint8 error_purge = CF_QueueSelect_All + 1; /* Shortest return from CF_DoPurgeQueue */ + CF_PurgeQueueCmd_t utbuf; + CF_QueueSelect_Payload_t *data = &utbuf.Payload; + uint16 initial_hk_err_counter = Any_uint16(); memset(&utbuf, 0, sizeof(utbuf)); /* Arrange unstubbable: CF_DoChanAction */ - data->byte[0] = channel; + data->ChannelSelect = chan_num; /* Arrange unstubbable: CF_DoPurgeQueue */ - data->byte[1] = error_purge; + data->QueueSelect = error_purge; - CF_AppData.hk.Payload.counters.err = initial_hk_err_counter; + CF_AppData.counters.err = initial_hk_err_counter; /* Act */ CF_PurgeQueueCmd(&utbuf); @@ -2273,9 +2122,9 @@ void Test_CF_PurgeQueueCmd_FailWhenActionFail(void) /* Assert */ /* Assert for CF_DoEnableDisablePolldir */ /* Assert for incremented counter */ - UtAssert_True(CF_AppData.hk.Payload.counters.err == (uint16)(initial_hk_err_counter + 1), - "CF_AppData.hk.Payload.counters.err is %d and should be 1 more than %d", - CF_AppData.hk.Payload.counters.err, + UtAssert_True(CF_AppData.counters.err == (uint16)(initial_hk_err_counter + 1), + "CF_AppData.counters.err is %d and should be 1 more than %d", + CF_AppData.counters.err, initial_hk_err_counter); UT_CF_AssertEventID(CF_CMD_PURGE_QUEUE_ERR_EID); } @@ -2283,16 +2132,16 @@ void Test_CF_PurgeQueueCmd_FailWhenActionFail(void) void Test_CF_PurgeQueueCmd_SuccessWhenActionSuccess(void) { /* Arrange */ - uint8 channel = Any_cf_channel(); - CF_PurgeQueueCmd_t utbuf; - CF_UnionArgs_Payload_t *data = &utbuf.Payload; + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + CF_PurgeQueueCmd_t utbuf; + CF_QueueSelect_Payload_t *data = &utbuf.Payload; memset(&utbuf, 0, sizeof(utbuf)); /* Arrange unstubbable: CF_DoChanAction */ - data->byte[0] = channel; + data->ChannelSelect = chan_num; - CF_AppData.hk.Payload.counters.cmd = 0; + CF_AppData.counters.cmd = 0; /* Act */ CF_PurgeQueueCmd(&utbuf); @@ -2300,7 +2149,7 @@ void Test_CF_PurgeQueueCmd_SuccessWhenActionSuccess(void) /* Assert */ /* Assert for CF_DoEnableDisablePolldir */ /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, 1); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CMD_PURGE_QUEUE_INF_EID); } @@ -2323,7 +2172,7 @@ void Test_CF_WriteQueueCmd_When_chan_Eq_CF_NUM_CAHNNELS_SendEventAndRejectComman /* invalid channel */ wq->chan = CF_NUM_CHANNELS; - CF_AppData.hk.Payload.counters.err = initial_hk_err_counter; + CF_AppData.counters.err = initial_hk_err_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -2332,7 +2181,7 @@ void Test_CF_WriteQueueCmd_When_chan_Eq_CF_NUM_CAHNNELS_SendEventAndRejectComman UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CMD_WQ_CHAN_ERR_EID); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); } void Test_CF_WriteQueueCmd_When_chan_GreaterThan_CF_NUM_CAHNNELS_SendEventAndRejectCommand(void) @@ -2345,9 +2194,9 @@ void Test_CF_WriteQueueCmd_When_chan_GreaterThan_CF_NUM_CAHNNELS_SendEventAndRej memset(&utbuf, 0, sizeof(utbuf)); /* invalid channel */ - wq->chan = Any_uint8_GreaterThan(CF_NUM_CHANNELS); + wq->chan = CF_NUM_CHANNELS + 1; - CF_AppData.hk.Payload.counters.err = initial_hk_err_counter; + CF_AppData.counters.err = initial_hk_err_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -2357,7 +2206,7 @@ void Test_CF_WriteQueueCmd_When_chan_GreaterThan_CF_NUM_CAHNNELS_SendEventAndRej UT_CF_AssertEventID(CF_CMD_WQ_CHAN_ERR_EID); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); } void Test_CF_WriteQueueCmd_WhenUpAndPendingQueueSendEventAndRejectCommand(void) @@ -2370,13 +2219,13 @@ void Test_CF_WriteQueueCmd_WhenUpAndPendingQueueSendEventAndRejectCommand(void) memset(&utbuf, 0, sizeof(utbuf)); /* valid channel */ - wq->chan = Any_uint8_LessThan(CF_NUM_CHANNELS); + wq->chan = Any_cf_chan_num(); /* invalid combination up direction, pending queue */ wq->type = CF_Type_up; - wq->queue = CF_Queue_pend; + wq->queue = CF_QueueSelect_Pending; - CF_AppData.hk.Payload.counters.err = initial_hk_err_counter; + CF_AppData.counters.err = initial_hk_err_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -2386,7 +2235,7 @@ void Test_CF_WriteQueueCmd_WhenUpAndPendingQueueSendEventAndRejectCommand(void) UT_CF_AssertEventID(CF_CMD_WQ_ARGS_ERR_EID); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); } void Test_CF_WriteQueueCmd_When_CF_WrappedCreat_Fails_type_Is_type_up_And_queue_IsNot_q_pend_SendEventAndRejectCommand( @@ -2401,7 +2250,7 @@ void Test_CF_WriteQueueCmd_When_CF_WrappedCreat_Fails_type_Is_type_up_And_queue_ memset(&utbuf, 0, sizeof(utbuf)); /* valid channel */ - wq->chan = Any_uint8_LessThan(CF_NUM_CHANNELS); + wq->chan = Any_cf_chan_num(); /* valid combination up direction, NOT pending queue */ wq->type = CF_Type_up; @@ -2417,7 +2266,7 @@ void Test_CF_WriteQueueCmd_When_CF_WrappedCreat_Fails_type_Is_type_up_And_queue_ sizeof(context_CF_WrappedOpenCreate), false); - CF_AppData.hk.Payload.counters.err = initial_hk_err_counter; + CF_AppData.counters.err = initial_hk_err_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -2429,7 +2278,7 @@ void Test_CF_WriteQueueCmd_When_CF_WrappedCreat_Fails_type_Is_type_up_And_queue_ UT_CF_AssertEventID(CF_CMD_WQ_OPEN_ERR_EID); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); } void Test_CF_WriteQueueCmd_When_CF_WrappedCreat_Fails_type_IsNot_type_up_And_queue_Is_q_pend_SendEventAndRejectCommand( @@ -2444,11 +2293,11 @@ void Test_CF_WriteQueueCmd_When_CF_WrappedCreat_Fails_type_IsNot_type_up_And_que memset(&utbuf, 0, sizeof(utbuf)); /* valid channel */ - wq->chan = Any_uint8_LessThan(CF_NUM_CHANNELS); + wq->chan = Any_cf_chan_num(); /* valid combination down direction, pending queue */ wq->type = CF_Type_down; - wq->queue = CF_Queue_pend; + wq->queue = CF_QueueSelect_Pending; /* invalid result from CF_WrappedCreat */ strncpy(wq->filename, AnyRandomStringOfLettersOfLength(10), 10); @@ -2460,7 +2309,7 @@ void Test_CF_WriteQueueCmd_When_CF_WrappedCreat_Fails_type_IsNot_type_up_And_que sizeof(context_CF_WrappedOpenCreate), false); - CF_AppData.hk.Payload.counters.err = initial_hk_err_counter; + CF_AppData.counters.err = initial_hk_err_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -2472,7 +2321,7 @@ void Test_CF_WriteQueueCmd_When_CF_WrappedCreat_Fails_type_IsNot_type_up_And_que UT_CF_AssertEventID(CF_CMD_WQ_OPEN_ERR_EID); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); } void Test_CF_WriteQueueCmd_When_wq_IsAllAnd_queue_IsAll_fd_Is_0_Call_CF_WrappedClose_SendEventCloseAndRejectCommandWhen_CF_WriteTxnQueueDataToFile_Fails( @@ -2490,11 +2339,11 @@ void Test_CF_WriteQueueCmd_When_wq_IsAllAnd_queue_IsAll_fd_Is_0_Call_CF_WrappedC memset(&utbuf, 0, sizeof(utbuf)); /* valid channel */ - wq->chan = Any_uint8_LessThan(CF_NUM_CHANNELS); + wq->chan = Any_cf_chan_num(); /* valid combination all direction, all queue */ wq->type = CF_Type_all; - wq->queue = CF_Queue_all; + wq->queue = CF_QueueSelect_All; /* valid result from CF_WrappedCreat */ strncpy(wq->filename, AnyRandomStringOfLettersOfLength(10), 10); @@ -2513,7 +2362,7 @@ void Test_CF_WriteQueueCmd_When_wq_IsAllAnd_queue_IsAll_fd_Is_0_Call_CF_WrappedC false); UT_SetDefaultReturnValue(UT_KEY(CF_WriteTxnQueueDataToFile), forced_return_CF_WriteTxnQueueDataToFile); - CF_AppData.hk.Payload.counters.err = initial_hk_err_counter; + CF_AppData.counters.err = initial_hk_err_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -2524,7 +2373,7 @@ void Test_CF_WriteQueueCmd_When_wq_IsAllAnd_queue_IsAll_fd_Is_0_Call_CF_WrappedC UT_CF_AssertEventID(CF_CMD_WQ_WRITEQ_RX_ERR_EID); UtAssert_STUB_COUNT(CF_WrappedClose, 1); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); } void Test_CF_WriteQueueCmd_When_CF_WriteTxnQueueDataToFile_FailsAnd_wq_IsUpAnd_queue_IsActive_fd_IsPositive_Call_CF_WrappedClose_SendEventClosesAndRejectCommand( @@ -2543,11 +2392,11 @@ void Test_CF_WriteQueueCmd_When_CF_WriteTxnQueueDataToFile_FailsAnd_wq_IsUpAnd_q memset(&utbuf, 0, sizeof(utbuf)); /* valid channel */ - wq->chan = Any_uint8_LessThan(CF_NUM_CHANNELS); + wq->chan = Any_cf_chan_num(); /* valid combination all direction, all queue */ wq->type = CF_Type_up; - wq->queue = CF_Queue_active; + wq->queue = CF_QueueSelect_Active; /* valid result from CF_WrappedCreat */ strncpy(wq->filename, AnyRandomStringOfLettersOfLength(10), 10); @@ -2568,7 +2417,7 @@ void Test_CF_WriteQueueCmd_When_CF_WriteTxnQueueDataToFile_FailsAnd_wq_IsUpAnd_q UT_SetDataBuffer(UT_KEY(CF_WrappedClose), &context_CF_WrappedClose_fd, sizeof(context_CF_WrappedClose_fd), false); - CF_AppData.hk.Payload.counters.err = initial_hk_err_counter; + CF_AppData.counters.err = initial_hk_err_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -2579,7 +2428,7 @@ void Test_CF_WriteQueueCmd_When_CF_WriteTxnQueueDataToFile_FailsAnd_wq_IsUpAnd_q UT_CF_AssertEventID(CF_CMD_WQ_WRITEQ_RX_ERR_EID); UtAssert_STUB_COUNT(CF_WrappedClose, 1); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); } void Test_CF_WriteQueueCmd_When_CF_WriteHistoryQueueDataToFile_FailsAnd_wq_IsUpAnd_queue_IsHistory_fd_IsPositive_Call_CF_WrappedClose_SendEventCloseAndRejectCommand( @@ -2598,11 +2447,11 @@ void Test_CF_WriteQueueCmd_When_CF_WriteHistoryQueueDataToFile_FailsAnd_wq_IsUpA memset(&utbuf, 0, sizeof(utbuf)); /* valid channel */ - wq->chan = Any_uint8_LessThan(CF_NUM_CHANNELS); + wq->chan = Any_cf_chan_num(); /* valid combination all direction, all queue */ wq->type = CF_Type_up; - wq->queue = CF_Queue_history; + wq->queue = CF_QueueSelect_History; /* valid result from CF_WrappedCreat */ strncpy(wq->filename, AnyRandomStringOfLettersOfLength(10), 10); @@ -2623,7 +2472,7 @@ void Test_CF_WriteQueueCmd_When_CF_WriteHistoryQueueDataToFile_FailsAnd_wq_IsUpA UT_SetDataBuffer(UT_KEY(CF_WrappedClose), &context_CF_WrappedClose_fd, sizeof(context_CF_WrappedClose_fd), false); - CF_AppData.hk.Payload.counters.err = initial_hk_err_counter; + CF_AppData.counters.err = initial_hk_err_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -2634,7 +2483,7 @@ void Test_CF_WriteQueueCmd_When_CF_WriteHistoryQueueDataToFile_FailsAnd_wq_IsUpA UT_CF_AssertEventID(CF_CMD_WQ_WRITEHIST_RX_ERR_EID); UtAssert_STUB_COUNT(CF_WrappedClose, 1); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); } void Test_CF_WriteQueueCmd_When_CF_WriteHistoryDataToFile_FailsOnFirstCallAnd_wq_IsDownAnd_queue_IsActive_fd_IsPositive_Call_CF_WrappedClose_SendEventCloseAndRejectCommand( @@ -2653,11 +2502,11 @@ void Test_CF_WriteQueueCmd_When_CF_WriteHistoryDataToFile_FailsOnFirstCallAnd_wq memset(&utbuf, 0, sizeof(utbuf)); /* valid channel */ - wq->chan = Any_uint8_LessThan(CF_NUM_CHANNELS); + wq->chan = Any_cf_chan_num(); /* valid combination all direction, all queue */ wq->type = CF_Type_down; - wq->queue = CF_Queue_active; + wq->queue = CF_QueueSelect_Active; /* valid result from CF_WrappedCreat */ strncpy(wq->filename, AnyRandomStringOfLettersOfLength(10), 10); @@ -2678,7 +2527,7 @@ void Test_CF_WriteQueueCmd_When_CF_WriteHistoryDataToFile_FailsOnFirstCallAnd_wq UT_SetDataBuffer(UT_KEY(CF_WrappedClose), &context_CF_WrappedClose_fd, sizeof(context_CF_WrappedClose_fd), false); - CF_AppData.hk.Payload.counters.err = initial_hk_err_counter; + CF_AppData.counters.err = initial_hk_err_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -2689,7 +2538,7 @@ void Test_CF_WriteQueueCmd_When_CF_WriteHistoryDataToFile_FailsOnFirstCallAnd_wq UT_CF_AssertEventID(CF_CMD_WQ_WRITEQ_TX_ERR_EID); UtAssert_STUB_COUNT(CF_WrappedClose, 1); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); } void Test_CF_WriteQueueCmd_When_CF_WriteHistoryQueueDataToFile_FailsAnd_wq_IsDownAnd_queue_IsPend_fd_IsPositive_Call_CF_WrappedClose_SendEventCloseAndRejectCommand( @@ -2708,11 +2557,11 @@ void Test_CF_WriteQueueCmd_When_CF_WriteHistoryQueueDataToFile_FailsAnd_wq_IsDow memset(&utbuf, 0, sizeof(utbuf)); /* valid channel */ - wq->chan = Any_uint8_LessThan(CF_NUM_CHANNELS); + wq->chan = Any_cf_chan_num(); /* valid combination all direction, all queue */ wq->type = CF_Type_down; - wq->queue = CF_Queue_pend; + wq->queue = CF_QueueSelect_Pending; /* valid result from CF_WrappedCreat */ strncpy(wq->filename, AnyRandomStringOfLettersOfLength(10), 10); @@ -2733,7 +2582,7 @@ void Test_CF_WriteQueueCmd_When_CF_WriteHistoryQueueDataToFile_FailsAnd_wq_IsDow UT_SetDataBuffer(UT_KEY(CF_WrappedClose), &context_CF_WrappedClose_fd, sizeof(context_CF_WrappedClose_fd), false); - CF_AppData.hk.Payload.counters.err = initial_hk_err_counter; + CF_AppData.counters.err = initial_hk_err_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -2744,7 +2593,7 @@ void Test_CF_WriteQueueCmd_When_CF_WriteHistoryQueueDataToFile_FailsAnd_wq_IsDow UT_CF_AssertEventID(CF_CMD_WQ_WRITEQ_PEND_ERR_EID); UtAssert_STUB_COUNT(CF_WrappedClose, 1); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); } void Test_CF_WriteQueueCmd_When_CF_WriteHistoryQueueDataToFile_FailsAnd_wq_IsDownAnd_queue_IsHistory_fd_IsPositive_Call_CF_WrappedClose_SendEventCloseAndRejectCommand( @@ -2763,11 +2612,11 @@ void Test_CF_WriteQueueCmd_When_CF_WriteHistoryQueueDataToFile_FailsAnd_wq_IsDow memset(&utbuf, 0, sizeof(utbuf)); /* valid channel */ - wq->chan = Any_uint8_LessThan(CF_NUM_CHANNELS); + wq->chan = Any_cf_chan_num(); /* valid combination all direction, all queue */ wq->type = CF_Type_down; - wq->queue = CF_Queue_history; + wq->queue = CF_QueueSelect_History; /* valid result from CF_WrappedCreat */ strncpy(wq->filename, AnyRandomStringOfLettersOfLength(10), 10); @@ -2788,7 +2637,7 @@ void Test_CF_WriteQueueCmd_When_CF_WriteHistoryQueueDataToFile_FailsAnd_wq_IsDow UT_SetDataBuffer(UT_KEY(CF_WrappedClose), &context_CF_WrappedClose_fd, sizeof(context_CF_WrappedClose_fd), false); - CF_AppData.hk.Payload.counters.err = initial_hk_err_counter; + CF_AppData.counters.err = initial_hk_err_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -2799,7 +2648,7 @@ void Test_CF_WriteQueueCmd_When_CF_WriteHistoryQueueDataToFile_FailsAnd_wq_IsDow UT_CF_AssertEventID(CF_CMD_WQ_WRITEHIST_TX_ERR_EID); UtAssert_STUB_COUNT(CF_WrappedClose, 1); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); } void Test_CF_WriteQueueCmd_Success_type_AllAnd_q_All(void) @@ -2816,11 +2665,11 @@ void Test_CF_WriteQueueCmd_Success_type_AllAnd_q_All(void) memset(&utbuf, 0, sizeof(utbuf)); /* valid channel */ - wq->chan = Any_uint8_LessThan(CF_NUM_CHANNELS); + wq->chan = Any_cf_chan_num(); /* valid combination all direction, all queue */ wq->type = CF_Type_all; - wq->queue = CF_Queue_all; + wq->queue = CF_QueueSelect_All; /* valid result from CF_WrappedCreat */ strncpy(wq->filename, AnyRandomStringOfLettersOfLength(10), 10); @@ -2838,7 +2687,7 @@ void Test_CF_WriteQueueCmd_Success_type_AllAnd_q_All(void) /* valid result from CF_WriteHistoryQueueDataToFile */ UT_SetDefaultReturnValue(UT_KEY(CF_WriteHistoryQueueDataToFile), forced_return_CF_WriteHistoryQueueDataToFile); - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -2850,7 +2699,7 @@ void Test_CF_WriteQueueCmd_Success_type_AllAnd_q_All(void) UT_CF_AssertEventID(CF_CMD_WQ_INF_EID); UtAssert_STUB_COUNT(CF_WrappedClose, 0); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); } void Test_CF_WriteQueueCmd_Success_type_AllAnd_q_History(void) @@ -2866,11 +2715,11 @@ void Test_CF_WriteQueueCmd_Success_type_AllAnd_q_History(void) memset(&utbuf, 0, sizeof(utbuf)); /* valid channel */ - wq->chan = Any_uint8_LessThan(CF_NUM_CHANNELS); + wq->chan = Any_cf_chan_num(); /* valid combination all direction, all queue */ wq->type = CF_Type_all; - wq->queue = CF_Queue_history; + wq->queue = CF_QueueSelect_History; /* valid result from CF_WrappedCreat */ strncpy(wq->filename, AnyRandomStringOfLettersOfLength(10), 10); @@ -2885,7 +2734,7 @@ void Test_CF_WriteQueueCmd_Success_type_AllAnd_q_History(void) /* valid result from CF_WriteHistoryQueueDataToFile */ UT_SetDefaultReturnValue(UT_KEY(CF_WriteHistoryQueueDataToFile), forced_return_CF_WriteHistoryQueueDataToFile); - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -2897,7 +2746,7 @@ void Test_CF_WriteQueueCmd_Success_type_AllAnd_q_History(void) UT_CF_AssertEventID(CF_CMD_WQ_INF_EID); UtAssert_STUB_COUNT(CF_WrappedClose, 0); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); } void Test_CF_WriteQueueCmd_Success_type_AllAnd_q_Active(void) @@ -2913,11 +2762,11 @@ void Test_CF_WriteQueueCmd_Success_type_AllAnd_q_Active(void) memset(&utbuf, 0, sizeof(utbuf)); /* valid channel */ - wq->chan = Any_uint8_LessThan(CF_NUM_CHANNELS); + wq->chan = Any_cf_chan_num(); /* valid combination all direction, all queue */ wq->type = CF_Type_all; - wq->queue = CF_Queue_active; + wq->queue = CF_QueueSelect_Active; /* valid result from CF_WrappedCreat */ strncpy(wq->filename, AnyRandomStringOfLettersOfLength(10), 10); @@ -2932,7 +2781,7 @@ void Test_CF_WriteQueueCmd_Success_type_AllAnd_q_Active(void) /* valid result from CF_WriteTxnQueueDataToFile */ UT_SetDefaultReturnValue(UT_KEY(CF_WriteTxnQueueDataToFile), forced_return_CF_WriteTxnQueueDataToFile); - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -2944,7 +2793,7 @@ void Test_CF_WriteQueueCmd_Success_type_AllAnd_q_Active(void) UT_CF_AssertEventID(CF_CMD_WQ_INF_EID); UtAssert_STUB_COUNT(CF_WrappedClose, 0); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); } void Test_CF_WriteQueueCmd_Success_type_AllAnd_q_Pend(void) @@ -2960,11 +2809,11 @@ void Test_CF_WriteQueueCmd_Success_type_AllAnd_q_Pend(void) memset(&utbuf, 0, sizeof(utbuf)); /* valid channel */ - wq->chan = Any_uint8_LessThan(CF_NUM_CHANNELS); + wq->chan = Any_cf_chan_num(); /* valid combination all direction, all queue */ wq->type = CF_Type_all; - wq->queue = CF_Queue_pend; + wq->queue = CF_QueueSelect_Pending; /* valid result from CF_WrappedCreat */ strncpy(wq->filename, AnyRandomStringOfLettersOfLength(10), 10); @@ -2979,7 +2828,7 @@ void Test_CF_WriteQueueCmd_Success_type_AllAnd_q_Pend(void) /* valid result from CF_WriteTxnQueueDataToFile */ UT_SetDefaultReturnValue(UT_KEY(CF_WriteTxnQueueDataToFile), forced_return_CF_WriteTxnQueueDataToFile); - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -2991,7 +2840,7 @@ void Test_CF_WriteQueueCmd_Success_type_AllAnd_q_Pend(void) UT_CF_AssertEventID(CF_CMD_WQ_INF_EID); UtAssert_STUB_COUNT(CF_WrappedClose, 0); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); } void Test_CF_WriteQueueCmd_Success_type_UpAnd_q_All(void) @@ -3008,11 +2857,11 @@ void Test_CF_WriteQueueCmd_Success_type_UpAnd_q_All(void) memset(&utbuf, 0, sizeof(utbuf)); /* valid channel */ - wq->chan = Any_uint8_LessThan(CF_NUM_CHANNELS); + wq->chan = Any_cf_chan_num(); /* valid combination all direction, all queue */ wq->type = CF_Type_up; - wq->queue = CF_Queue_all; + wq->queue = CF_QueueSelect_All; /* valid result from CF_WrappedCreat */ strncpy(wq->filename, AnyRandomStringOfLettersOfLength(10), 10); @@ -3030,7 +2879,7 @@ void Test_CF_WriteQueueCmd_Success_type_UpAnd_q_All(void) /* valid result from CF_WriteHistoryQueueDataToFile */ UT_SetDefaultReturnValue(UT_KEY(CF_WriteHistoryQueueDataToFile), forced_return_CF_WriteHistoryQueueDataToFile); - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -3042,7 +2891,7 @@ void Test_CF_WriteQueueCmd_Success_type_UpAnd_q_All(void) UT_CF_AssertEventID(CF_CMD_WQ_INF_EID); UtAssert_STUB_COUNT(CF_WrappedClose, 0); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); } void Test_CF_WriteQueueCmd_Success_type_UpAnd_q_History(void) @@ -3058,11 +2907,11 @@ void Test_CF_WriteQueueCmd_Success_type_UpAnd_q_History(void) memset(&utbuf, 0, sizeof(utbuf)); /* valid channel */ - wq->chan = Any_uint8_LessThan(CF_NUM_CHANNELS); + wq->chan = Any_cf_chan_num(); /* valid combination all direction, all queue */ wq->type = CF_Type_up; - wq->queue = CF_Queue_history; + wq->queue = CF_QueueSelect_History; /* valid result from CF_WrappedCreat */ strncpy(wq->filename, AnyRandomStringOfLettersOfLength(10), 10); @@ -3077,7 +2926,7 @@ void Test_CF_WriteQueueCmd_Success_type_UpAnd_q_History(void) /* valid result from CF_WriteHistoryQueueDataToFile */ UT_SetDefaultReturnValue(UT_KEY(CF_WriteHistoryQueueDataToFile), forced_return_CF_WriteHistoryQueueDataToFile); - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -3089,7 +2938,7 @@ void Test_CF_WriteQueueCmd_Success_type_UpAnd_q_History(void) UT_CF_AssertEventID(CF_CMD_WQ_INF_EID); UtAssert_STUB_COUNT(CF_WrappedClose, 0); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); } void Test_CF_WriteQueueCmd_Success_type_UpAnd_q_Active(void) @@ -3105,11 +2954,11 @@ void Test_CF_WriteQueueCmd_Success_type_UpAnd_q_Active(void) memset(&utbuf, 0, sizeof(utbuf)); /* valid channel */ - wq->chan = Any_uint8_LessThan(CF_NUM_CHANNELS); + wq->chan = Any_cf_chan_num(); /* valid combination all direction, all queue */ wq->type = CF_Type_up; - wq->queue = CF_Queue_active; + wq->queue = CF_QueueSelect_Active; /* valid result from CF_WrappedCreat */ strncpy(wq->filename, AnyRandomStringOfLettersOfLength(10), 10); @@ -3124,7 +2973,7 @@ void Test_CF_WriteQueueCmd_Success_type_UpAnd_q_Active(void) /* valid result from CF_WriteTxnQueueDataToFile */ UT_SetDefaultReturnValue(UT_KEY(CF_WriteTxnQueueDataToFile), forced_return_CF_WriteTxnQueueDataToFile); - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -3136,7 +2985,7 @@ void Test_CF_WriteQueueCmd_Success_type_UpAnd_q_Active(void) UT_CF_AssertEventID(CF_CMD_WQ_INF_EID); UtAssert_STUB_COUNT(CF_WrappedClose, 0); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); } /* Test_CF_WriteQueueCmd_Success_type_UpAnd_q_Pend IS an error and is handled by a previous test */ @@ -3154,11 +3003,11 @@ void Test_CF_WriteQueueCmd_Success_type_DownAnd_q_All(void) memset(&utbuf, 0, sizeof(utbuf)); /* valid channel */ - wq->chan = Any_uint8_LessThan(CF_NUM_CHANNELS); + wq->chan = Any_cf_chan_num(); /* valid combination all direction, all queue */ wq->type = CF_Type_down; - wq->queue = CF_Queue_all; + wq->queue = CF_QueueSelect_All; /* valid result from CF_WrappedCreat */ strncpy(wq->filename, AnyRandomStringOfLettersOfLength(10), 10); @@ -3173,7 +3022,7 @@ void Test_CF_WriteQueueCmd_Success_type_DownAnd_q_All(void) /* valid result from CF_WriteTxnQueueDataToFile */ UT_SetDefaultReturnValue(UT_KEY(CF_WriteTxnQueueDataToFile), forced_return_CF_WriteTxnQueueDataToFile); - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -3185,7 +3034,7 @@ void Test_CF_WriteQueueCmd_Success_type_DownAnd_q_All(void) UT_CF_AssertEventID(CF_CMD_WQ_INF_EID); UtAssert_STUB_COUNT(CF_WrappedClose, 0); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); } void Test_CF_WriteQueueCmd_Success_type_DownAnd_q_History(void) @@ -3201,11 +3050,11 @@ void Test_CF_WriteQueueCmd_Success_type_DownAnd_q_History(void) memset(&utbuf, 0, sizeof(utbuf)); /* valid channel */ - wq->chan = Any_uint8_LessThan(CF_NUM_CHANNELS); + wq->chan = Any_cf_chan_num(); /* valid combination all direction, all queue */ wq->type = CF_Type_down; - wq->queue = CF_Queue_history; + wq->queue = CF_QueueSelect_History; /* valid result from CF_WrappedCreat */ strncpy(wq->filename, AnyRandomStringOfLettersOfLength(10), 10); @@ -3220,7 +3069,7 @@ void Test_CF_WriteQueueCmd_Success_type_DownAnd_q_History(void) /* valid result from CF_WriteTxnQueueDataToFile */ UT_SetDefaultReturnValue(UT_KEY(CF_WriteTxnQueueDataToFile), forced_return_CF_WriteTxnQueueDataToFile); - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -3232,7 +3081,7 @@ void Test_CF_WriteQueueCmd_Success_type_DownAnd_q_History(void) UT_CF_AssertEventID(CF_CMD_WQ_INF_EID); UtAssert_STUB_COUNT(CF_WrappedClose, 0); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); } void Test_CF_WriteQueueCmd_Success_type_DownAnd_q_Active(void) @@ -3248,11 +3097,11 @@ void Test_CF_WriteQueueCmd_Success_type_DownAnd_q_Active(void) memset(&utbuf, 0, sizeof(utbuf)); /* valid channel */ - wq->chan = Any_uint8_LessThan(CF_NUM_CHANNELS); + wq->chan = Any_cf_chan_num(); /* valid combination all direction, all queue */ wq->type = CF_Type_down; - wq->queue = CF_Queue_active; + wq->queue = CF_QueueSelect_Active; /* valid result from CF_WrappedCreat */ strncpy(wq->filename, AnyRandomStringOfLettersOfLength(10), 10); @@ -3267,7 +3116,7 @@ void Test_CF_WriteQueueCmd_Success_type_DownAnd_q_Active(void) /* valid result from CF_WriteTxnQueueDataToFile */ UT_SetDefaultReturnValue(UT_KEY(CF_WriteTxnQueueDataToFile), forced_return_CF_WriteTxnQueueDataToFile); - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -3279,7 +3128,7 @@ void Test_CF_WriteQueueCmd_Success_type_DownAnd_q_Active(void) UT_CF_AssertEventID(CF_CMD_WQ_INF_EID); UtAssert_STUB_COUNT(CF_WrappedClose, 0); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); } void Test_CF_WriteQueueCmd_Success_type_DownAnd_q_Pend(void) @@ -3295,11 +3144,11 @@ void Test_CF_WriteQueueCmd_Success_type_DownAnd_q_Pend(void) memset(&utbuf, 0, sizeof(utbuf)); /* valid channel */ - wq->chan = Any_uint8_LessThan(CF_NUM_CHANNELS); + wq->chan = Any_cf_chan_num(); /* valid combination all direction, all queue */ wq->type = CF_Type_down; - wq->queue = CF_Queue_pend; + wq->queue = CF_QueueSelect_Pending; /* valid result from CF_WrappedCreat */ strncpy(wq->filename, AnyRandomStringOfLettersOfLength(10), 10); @@ -3314,7 +3163,7 @@ void Test_CF_WriteQueueCmd_Success_type_DownAnd_q_Pend(void) /* valid result from CF_WriteTxnQueueDataToFile */ UT_SetDefaultReturnValue(UT_KEY(CF_WriteTxnQueueDataToFile), forced_return_CF_WriteTxnQueueDataToFile); - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_WriteQueueCmd(&utbuf); @@ -3326,7 +3175,7 @@ void Test_CF_WriteQueueCmd_Success_type_DownAnd_q_Pend(void) UT_CF_AssertEventID(CF_CMD_WQ_INF_EID); UtAssert_STUB_COUNT(CF_WrappedClose, 0); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); } /******************************************************************************* @@ -3338,12 +3187,11 @@ void Test_CF_WriteQueueCmd_Success_type_DownAnd_q_Pend(void) void Test_CF_ValidateChunkSizeCmd_val_GreaterThan_pdu_fd_data_t_FailAndReturn_1(void) { /* Arrange */ - uint8 arg_chan_num = Any_uint8(); /* value labeled as 'ignored' in func def */ - size_t arg_val = sizeof(CF_CFDP_PduFileDataContent_t) + 1; + size_t arg_val = sizeof(CF_CFDP_PduFileDataContent_t) + 1; CF_ChanAction_Status_t local_result; /* Act */ - local_result = CF_ValidateChunkSizeCmd(arg_val, arg_chan_num); + local_result = CF_ValidateChunkSizeCmd(arg_val, NULL); /* Assert */ UtAssert_INT32_EQ(local_result, CF_ChanAction_Status_ERROR); @@ -3352,12 +3200,11 @@ void Test_CF_ValidateChunkSizeCmd_val_GreaterThan_pdu_fd_data_t_FailAndReturn_1( void Test_CF_ValidateChunkSizeCmd_Any_val_GreaterThan_pdu_fd_data_t_FailAndReturn_1(void) { /* Arrange */ - uint8 arg_chan_num = Any_uint8(); /* value labeled as 'ignored' in func def */ - uint32 arg_val = Any_uint32_GreaterThan(sizeof(CF_CFDP_PduFileDataContent_t)); + uint32 arg_val = Any_uint32_GreaterThan(sizeof(CF_CFDP_PduFileDataContent_t)); CF_ChanAction_Status_t local_result; /* Act */ - local_result = CF_ValidateChunkSizeCmd(arg_val, arg_chan_num); + local_result = CF_ValidateChunkSizeCmd(arg_val, NULL); /* Assert */ UtAssert_INT32_EQ(local_result, CF_ChanAction_Status_ERROR); @@ -3366,12 +3213,11 @@ void Test_CF_ValidateChunkSizeCmd_Any_val_GreaterThan_pdu_fd_data_t_FailAndRetur void Test_CF_ValidateChunkSizeCmd_val_SizeOf_pdu_fd_data_t_SuccessAndReturn_0(void) { /* Arrange */ - uint8 arg_chan_num = Any_uint8(); /* value labeled as 'ignored' in func def */ - size_t arg_val = sizeof(CF_CFDP_PduFileDataContent_t); + size_t arg_val = sizeof(CF_CFDP_PduFileDataContent_t); CF_ChanAction_Status_t local_result; /* Act */ - local_result = CF_ValidateChunkSizeCmd(arg_val, arg_chan_num); + local_result = CF_ValidateChunkSizeCmd(arg_val, NULL); /* Assert */ UtAssert_INT32_EQ(local_result, CF_ChanAction_Status_SUCCESS); @@ -3380,12 +3226,11 @@ void Test_CF_ValidateChunkSizeCmd_val_SizeOf_pdu_fd_data_t_SuccessAndReturn_0(vo void Test_CF_ValidateChunkSizeCmd_val_LessThanOrEqSizeOf_pdu_fd_data_t_SuccessAndReturn_0(void) { /* Arrange */ - uint8 arg_chan_num = Any_uint8(); /* value labeled as 'ignored' in func def */ - uint32 arg_val = Any_uint32_LessThan_or_EqualTo(sizeof(CF_CFDP_PduFileDataContent_t)); + uint32 arg_val = Any_uint32_LessThan_or_EqualTo(sizeof(CF_CFDP_PduFileDataContent_t)); CF_ChanAction_Status_t local_result; /* Act */ - local_result = CF_ValidateChunkSizeCmd(arg_val, arg_chan_num); + local_result = CF_ValidateChunkSizeCmd(arg_val, NULL); /* Assert */ UtAssert_INT32_EQ(local_result, CF_ChanAction_Status_SUCCESS); @@ -3400,12 +3245,11 @@ void Test_CF_ValidateChunkSizeCmd_val_LessThanOrEqSizeOf_pdu_fd_data_t_SuccessAn void Test_CF_ValidateMaxOutgoingCmd_WhenGiven_val_IsNot_0_Return_0_Success(void) { /* Arrange */ - uint32 arg_val = Any_uint32_Except(0); - uint8 arg_chan_num = Any_uint8(); /* Any_uint8() used here because it shows value does not matter in this test */ + uint32 arg_val = Any_uint32_Except(0); CF_ChanAction_Status_t local_result; /* Act */ - local_result = CF_ValidateMaxOutgoingCmd(arg_val, arg_chan_num); + local_result = CF_ValidateMaxOutgoingCmd(arg_val, NULL); /* Assert */ UtAssert_INT32_EQ(local_result, CF_ChanAction_Status_SUCCESS); @@ -3414,16 +3258,15 @@ void Test_CF_ValidateMaxOutgoingCmd_WhenGiven_val_IsNot_0_Return_0_Success(void) void Test_CF_ValidateMaxOutgoingCmd_WhenGiven_val_Is_0_But_sem_name_IsNot_NULL_Return_0_Success(void) { /* Arrange */ - uint32 arg_val = 0; - uint8 arg_chan_num = Any_cf_chan_num(); /* Any_cf_chan_num used here because value matters to this test */ - CF_ConfigTable_t config_table; + uint32 arg_val = 0; + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); /* Any_cf_chan_num used here because value matters to this test */ CF_ChanAction_Status_t local_result; + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); - CF_AppData.config_table = &config_table; - memset(CF_AppData.config_table->chan[arg_chan_num].sem_name, (char)Any_uint8_Except(0), 1); + memset(chan->config.sem_name, (char)Any_uint8_Except(0), 1); /* Act */ - local_result = CF_ValidateMaxOutgoingCmd(arg_val, arg_chan_num); + local_result = CF_ValidateMaxOutgoingCmd(arg_val, chan); /* Assert */ UtAssert_INT32_EQ(local_result, CF_ChanAction_Status_SUCCESS); @@ -3432,16 +3275,15 @@ void Test_CF_ValidateMaxOutgoingCmd_WhenGiven_val_Is_0_But_sem_name_IsNot_NULL_R void Test_CF_ValidateMaxOutgoingCmd_WhenGiven_val_Is_0_And_sem_name_Is_NULL_Return_1_Fail(void) { /* Arrange */ - uint32 arg_val = 0; - uint8 arg_chan_num = Any_cf_chan_num(); /* Any_cf_chan_num used here because value matters to this test */ - CF_ConfigTable_t config_table; + uint32 arg_val = 0; + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); /* Any_cf_chan_num used here because value matters to this test */ CF_ChanAction_Status_t local_result; + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); - CF_AppData.config_table = &config_table; - memset(CF_AppData.config_table->chan[arg_chan_num].sem_name, (char)0, 1); + memset(chan->config.sem_name, (char)0, 1); /* Act */ - local_result = CF_ValidateMaxOutgoingCmd(arg_val, arg_chan_num); + local_result = CF_ValidateMaxOutgoingCmd(arg_val, chan); /* Assert */ UtAssert_INT32_EQ(local_result, CF_ChanAction_Status_ERROR); @@ -3456,18 +3298,17 @@ void Test_CF_ValidateMaxOutgoingCmd_WhenGiven_val_Is_0_And_sem_name_Is_NULL_Retu void Test_CF_GetSetParamCmd(void) { /* Test cases for: - * void CF_GetSetParamCmd(bool is_set, CF_GetSet_ValueID_t param_id, uint32 value, uint8 chan_num); + * void CF_GetSetParamCmd(bool is_set, CF_GetSet_ValueID_t param_id, uint32 value, CF_Channel_t *chan_ptr); */ /* Arrange */ - CF_ConfigTable_t ut_config_table; CF_GetSet_ValueID_t param_id; uint16 expected_count; + CF_Engine_t *engine_ptr = CF_GetEngine(); + CF_Channel_t *chan = UT_CFDP_CHANNEL_PTR; - memset(&ut_config_table, 0, sizeof(ut_config_table)); - memset(&CF_AppData.hk.Payload.counters, 0, sizeof(CF_AppData.hk.Payload.counters)); - CF_AppData.config_table = &ut_config_table; - expected_count = 0; + memset(&CF_AppData.counters, 0, sizeof(CF_AppData.counters)); + expected_count = 0; /* Nominal: "set" for each parameter */ for (param_id = 0; param_id < CF_GetSet_ValueID_MAX; ++param_id) @@ -3475,20 +3316,20 @@ void Test_CF_GetSetParamCmd(void) UT_CF_ResetEventCapture(); UtAssert_VOIDCALL(CF_GetSetParamCmd(true, param_id, 1 + param_id, UT_CFDP_CHANNEL)); UT_CF_AssertEventID(CF_CMD_GETSET1_INF_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, ++expected_count); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, ++expected_count); } /* each of the config parameters should have actually been set to a different value */ - UtAssert_UINT32_EQ(ut_config_table.ticks_per_second, 1); - UtAssert_UINT32_EQ(ut_config_table.rx_crc_calc_bytes_per_wakeup, 2); - UtAssert_UINT32_EQ(ut_config_table.chan[UT_CFDP_CHANNEL].ack_timer_s, 3); - UtAssert_UINT32_EQ(ut_config_table.chan[UT_CFDP_CHANNEL].nak_timer_s, 4); - UtAssert_UINT32_EQ(ut_config_table.chan[UT_CFDP_CHANNEL].inactivity_timer_s, 5); - UtAssert_UINT32_EQ(ut_config_table.outgoing_file_chunk_size, 6); - UtAssert_UINT32_EQ(ut_config_table.chan[UT_CFDP_CHANNEL].ack_limit, 7); - UtAssert_UINT32_EQ(ut_config_table.chan[UT_CFDP_CHANNEL].nak_limit, 8); - UtAssert_UINT32_EQ(ut_config_table.local_eid, 9); - UtAssert_UINT32_EQ(ut_config_table.chan[UT_CFDP_CHANNEL].max_outgoing_messages_per_wakeup, 10); + UtAssert_UINT32_EQ(engine_ptr->config.ticks_per_second, 1); + UtAssert_UINT32_EQ(engine_ptr->config.rx_crc_calc_bytes_per_wakeup, 2); + UtAssert_UINT32_EQ(chan->config.ack_timer_s, 3); + UtAssert_UINT32_EQ(chan->config.nak_timer_s, 4); + UtAssert_UINT32_EQ(chan->config.inactivity_timer_s, 5); + UtAssert_UINT32_EQ(engine_ptr->config.outgoing_file_chunk_size, 6); + UtAssert_UINT32_EQ(chan->config.ack_limit, 7); + UtAssert_UINT32_EQ(chan->config.nak_limit, 8); + UtAssert_UINT32_EQ(engine_ptr->config.local_eid, 9); + UtAssert_UINT32_EQ(chan->config.max_outgoing_messages_per_wakeup, 10); /* Nominal: "get" for each parameter */ for (param_id = 0; param_id < CF_GetSet_ValueID_MAX; ++param_id) @@ -3496,20 +3337,20 @@ void Test_CF_GetSetParamCmd(void) UT_CF_ResetEventCapture(); UtAssert_VOIDCALL(CF_GetSetParamCmd(false, param_id, 1, UT_CFDP_CHANNEL)); UT_CF_AssertEventID(CF_CMD_GETSET2_INF_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, ++expected_count); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, ++expected_count); } /* Bad param ID */ UT_CF_ResetEventCapture(); UtAssert_VOIDCALL(CF_GetSetParamCmd(false, CF_GetSet_ValueID_MAX, 0, UT_CFDP_CHANNEL)); UT_CF_AssertEventID(CF_CMD_GETSET_PARAM_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 1); /* Bad channel ID */ UT_CF_ResetEventCapture(); UtAssert_VOIDCALL(CF_GetSetParamCmd(false, 0, 0, CF_NUM_CHANNELS + 1)); UT_CF_AssertEventID(CF_CMD_GETSET_CHAN_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 2); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 2); /* Validation fail */ UT_CF_ResetEventCapture(); @@ -3518,7 +3359,7 @@ void Test_CF_GetSetParamCmd(void) 100 + sizeof(CF_CFDP_PduFileDataContent_t), UT_CFDP_CHANNEL)); UT_CF_AssertEventID(CF_CMD_GETSET_VALIDATE_ERR_EID); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 3); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 3); } /******************************************************************************* @@ -3531,26 +3372,23 @@ void Test_CF_SetParamCmd_Call_CF_GetSetParamCmd_With_cmd_key_And_cmd_value(void) { /* Arrange */ CF_SetParamCmd_t utbuf; - CF_ConfigTable_t config_table; + CF_Engine_t *engine_ptr = CF_GetEngine(); memset(&utbuf, 0, sizeof(utbuf)); - memset(&config_table, 0, sizeof(config_table)); utbuf.Payload.key = CF_GetSet_ValueID_ticks_per_second; utbuf.Payload.value = 1; - utbuf.Payload.chan_num = 0; - - CF_AppData.config_table = &config_table; + utbuf.Payload.chan_num = UT_CFDP_CHANNEL; /* Act */ CF_SetParamCmd(&utbuf); /* Assert */ - UtAssert_UINT32_EQ(CF_AppData.config_table->ticks_per_second, utbuf.Payload.value); + UtAssert_UINT32_EQ(engine_ptr->config.ticks_per_second, utbuf.Payload.value); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UtAssert_UINT32_EQ(UT_CF_CapturedEventIDs[0], CF_CMD_GETSET1_INF_EID); /* Assert for incremented counter() */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, 1); } /******************************************************************************* @@ -3563,15 +3401,11 @@ void Test_CF_GetParamCmd_Call_CF_GetSetParamCmd_With_cmd_data_byte_0_AndConstant { /* Arrange */ CF_GetParamCmd_t utbuf; - CF_ConfigTable_t config_table; memset(&utbuf, 0, sizeof(utbuf)); - memset(&config_table, 0, sizeof(config_table)); utbuf.Payload.key = CF_GetSet_ValueID_ticks_per_second; - utbuf.Payload.chan_num = 0; - - CF_AppData.config_table = &config_table; + utbuf.Payload.chan_num = UT_CFDP_CHANNEL; /* Act */ CF_GetParamCmd(&utbuf); @@ -3581,7 +3415,7 @@ void Test_CF_GetParamCmd_Call_CF_GetSetParamCmd_With_cmd_data_byte_0_AndConstant UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UtAssert_UINT32_EQ(UT_CF_CapturedEventIDs[0], CF_CMD_GETSET2_INF_EID); /* Assert for incremented counter() */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, 1); } /******************************************************************************* @@ -3596,26 +3430,25 @@ void Test_CF_EnableEngineCmd_WithEngineNotEnableInitSuccessAndIncrementCmdCounte CF_EnableEngineCmd_t utbuf; uint32 forced_return_CF_CFDP_InitEngine = CFE_SUCCESS; uint16 initial_hk_cmd_counter = Any_uint16(); + CF_Engine_t *engine_ptr = CF_GetEngine(); memset(&utbuf, 0, sizeof(utbuf)); - CF_AppData.engine.enabled = false; + engine_ptr->enabled = false; UT_SetDefaultReturnValue(UT_KEY(CF_CFDP_InitEngine), forced_return_CF_CFDP_InitEngine); - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_EnableEngineCmd(&utbuf); - UT_GetStubCount(UT_KEY(CF_CFDP_InitEngine)); - /* Assert */ UtAssert_STUB_COUNT(CF_CFDP_InitEngine, 1); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CMD_ENABLE_ENGINE_INF_EID); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); } void Test_CF_EnableEngineCmd_WithEngineNotEnableFailsInitSendEventAndIncrementErrCounter(void) @@ -3624,26 +3457,25 @@ void Test_CF_EnableEngineCmd_WithEngineNotEnableFailsInitSendEventAndIncrementEr CF_EnableEngineCmd_t utbuf; uint32 forced_return_CF_CFDP_InitEngine = Any_uint32_Except(CF_ChanAction_Status_SUCCESS); uint16 initial_hk_err_counter = Any_uint16(); + CF_Engine_t *engine_ptr = CF_GetEngine(); memset(&utbuf, 0, sizeof(utbuf)); - CF_AppData.engine.enabled = false; + engine_ptr->enabled = false; UT_SetDefaultReturnValue(UT_KEY(CF_CFDP_InitEngine), forced_return_CF_CFDP_InitEngine); - CF_AppData.hk.Payload.counters.err = initial_hk_err_counter; + CF_AppData.counters.err = initial_hk_err_counter; /* Act */ CF_EnableEngineCmd(&utbuf); - UT_GetStubCount(UT_KEY(CF_CFDP_InitEngine)); - /* Assert */ UtAssert_STUB_COUNT(CF_CFDP_InitEngine, 1); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CMD_ENABLE_ENGINE_ERR_EID); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.err, (initial_hk_err_counter + 1) & 0xFFFF); } void Test_CF_EnableEngineCmd_WithEngineEnableFailsSendEventAndIncrementCmdCounter(void) @@ -3651,24 +3483,23 @@ void Test_CF_EnableEngineCmd_WithEngineEnableFailsSendEventAndIncrementCmdCounte /* Arrange */ CF_EnableEngineCmd_t utbuf; uint16 initial_hk_cmd_counter = Any_uint16(); + CF_Engine_t *engine_ptr = CF_GetEngine(); memset(&utbuf, 0, sizeof(utbuf)); - CF_AppData.engine.enabled = true; + engine_ptr->enabled = true; - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_EnableEngineCmd(&utbuf); - UT_GetStubCount(UT_KEY(CF_CFDP_InitEngine)); - /* Assert */ UtAssert_STUB_COUNT(CF_CFDP_InitEngine, 0); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CMD_ENG_ALREADY_ENA_INF_EID); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); } /******************************************************************************* @@ -3682,12 +3513,13 @@ void Test_CF_DisableEngineCmd_SuccessWhenEngineEnabledAndIncrementCmdCounter(voi /* Arrange */ CF_DisableEngineCmd_t utbuf; uint16 initial_hk_cmd_counter = Any_uint16(); + CF_Engine_t *engine_ptr = CF_GetEngine(); memset(&utbuf, 0, sizeof(utbuf)); - CF_AppData.engine.enabled = true; + engine_ptr->enabled = true; - CF_AppData.hk.Payload.counters.cmd = initial_hk_cmd_counter; + CF_AppData.counters.cmd = initial_hk_cmd_counter; /* Act */ CF_DisableEngineCmd(&utbuf); @@ -3698,7 +3530,7 @@ void Test_CF_DisableEngineCmd_SuccessWhenEngineEnabledAndIncrementCmdCounter(voi UT_CF_AssertEventID(CF_CMD_DISABLE_ENGINE_INF_EID); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, (initial_hk_cmd_counter + 1) & 0xFFFF); } void Test_CF_DisableEngineCmd_WhenEngineDisabledAndIncrementCmdCounter(void) @@ -3706,12 +3538,13 @@ void Test_CF_DisableEngineCmd_WhenEngineDisabledAndIncrementCmdCounter(void) /* Arrange */ CF_DisableEngineCmd_t utbuf; uint16 initial_hk_counter = Any_uint16(); + CF_Engine_t *engine_ptr = CF_GetEngine(); memset(&utbuf, 0, sizeof(utbuf)); - CF_AppData.engine.enabled = false; + engine_ptr->enabled = false; - CF_AppData.hk.Payload.counters.cmd = initial_hk_counter; + CF_AppData.counters.cmd = initial_hk_counter; /* Act */ CF_DisableEngineCmd(&utbuf); @@ -3721,7 +3554,7 @@ void Test_CF_DisableEngineCmd_WhenEngineDisabledAndIncrementCmdCounter(void) UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CMD_ENG_ALREADY_DIS_INF_EID); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, (initial_hk_counter + 1) & 0xFFFF); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, (initial_hk_counter + 1) & 0xFFFF); } /******************************************************************************* @@ -3730,14 +3563,40 @@ void Test_CF_DisableEngineCmd_WhenEngineDisabledAndIncrementCmdCounter(void) ** *******************************************************************************/ -void Test_CF_SendHkCmd(void) +void Test_CF_SendHkCmd_Nominal(void) { + union + { + CFE_SB_Buffer_t sb; + CF_HkPacket_t hk; + } buf; + CFE_SB_Buffer_t *sb_buf = &buf.sb; + + memset(&buf, 0xFF, sizeof(buf)); + CF_AppData.counters.cmd = 10; + CF_AppData.counters.err = 20; + UT_SetDataBuffer(UT_KEY(CFE_SB_AllocateMessageBuffer), &sb_buf, sizeof(sb_buf), false); + + /* Act */ + CF_SendHkCmd(NULL); + + /* Assert */ + UtAssert_STUB_COUNT(CFE_MSG_Init, 1); + UtAssert_STUB_COUNT(CFE_SB_TransmitBuffer, 1); + UtAssert_UINT8_EQ(buf.hk.Payload.counters.cmd, CF_AppData.counters.cmd); + UtAssert_UINT8_EQ(buf.hk.Payload.counters.err, CF_AppData.counters.err); +} + +void Test_CF_SendHkCmd_NoBuffers(void) +{ + UT_SetDefaultReturnValue(UT_KEY(CFE_SB_AllocateMessageBuffer), -1); + /* Act */ CF_SendHkCmd(NULL); /* Assert */ - UtAssert_STUB_COUNT(CFE_SB_TimeStampMsg, 1); - UtAssert_STUB_COUNT(CFE_SB_TransmitMsg, 1); + UtAssert_STUB_COUNT(CFE_MSG_Init, 0); + UtAssert_STUB_COUNT(CFE_SB_TransmitBuffer, 0); } /******************************************************************************* @@ -4298,7 +4157,8 @@ void add_CF_DisableEngineCmd_tests(void) void add_CF_SendHkCmd_tests(void) { - UtTest_Add(Test_CF_SendHkCmd, cf_cmd_tests_Setup, cf_cmd_tests_Teardown, "Test_CF_SendHkCmd"); + UtTest_Add(Test_CF_SendHkCmd_Nominal, cf_cmd_tests_Setup, cf_cmd_tests_Teardown, "Test_CF_SendHkCmd_Nominal"); + UtTest_Add(Test_CF_SendHkCmd_NoBuffers, cf_cmd_tests_Setup, cf_cmd_tests_Teardown, "Test_CF_SendHkCmd_NoBuffers"); } void add_CF_WakeupCmd_tests(void) diff --git a/unit-test/cf_dispatch_tests.c b/unit-test/cf_dispatch_tests.c index 97d9fc7c..0c3c8e26 100644 --- a/unit-test/cf_dispatch_tests.c +++ b/unit-test/cf_dispatch_tests.c @@ -74,7 +74,7 @@ void Test_CF_ProcessGroundCommand_When_cmd_EqTo_CF_NUM_COMMANDS_FailAndSendEvent UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CC_ERR_EID); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 1); } void Test_CF_ProcessGroundCommand_When_cmd_GreaterThan_CF_NUM_COMMANDS_FailAndSendEvent(void) @@ -100,7 +100,7 @@ void Test_CF_ProcessGroundCommand_When_cmd_GreaterThan_CF_NUM_COMMANDS_FailAndSe UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CC_ERR_EID); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 1); } void Test_CF_ProcessGroundCommand_Receives_cmd_AndLengthDoesNotMatchExpectedForThatCommandSendEventAndFailure(void) @@ -130,7 +130,7 @@ void Test_CF_ProcessGroundCommand_Receives_cmd_AndLengthDoesNotMatchExpectedForT UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_CMD_LEN_ERR_EID); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 1); } void Test_CF_ProcessGroundCommand_ReceivesCmdCode_0x00_AndCall_CF_NoopCmd_With_msg(void) @@ -186,8 +186,8 @@ void Test_CF_ProcessGroundCommand_ReceivesCmdCode_0x0C_AndDoNothingBecause_fns_1 UtAssert_STUB_COUNT(CFE_MSG_GetSize, 1); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 0); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, 0); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 0); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, 0); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 0); } /******************************************************************************* @@ -227,8 +227,8 @@ void Test_CF_AppPipe_ProcessGroundCommand(void) UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); /* Assert for incremented counter */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.cmd, 0); - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.cmd, 0); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 1); } void Test_CF_AppPipe_WakeUp(void) @@ -280,7 +280,7 @@ void Test_CF_AppPipe_UnrecognizedCommandEnterDefaultPath(void) CF_AppPipe(arg_msg); /* Assert */ - UtAssert_UINT32_EQ(CF_AppData.hk.Payload.counters.err, 1); + UtAssert_UINT32_EQ(CF_AppData.counters.err, 1); UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1); UT_CF_AssertEventID(CF_MID_ERR_EID); } diff --git a/unit-test/cf_timer_tests.c b/unit-test/cf_timer_tests.c index 1d31148f..3a414cec 100644 --- a/unit-test/cf_timer_tests.c +++ b/unit-test/cf_timer_tests.c @@ -48,10 +48,9 @@ void Test_CF_Timer_Sec2Ticks_ReturnExpectedValue(void) /* Arrange */ CF_Timer_Seconds_t arg_sec = Any_uint32(); uint32 ticks_per_second = Any_uint32(); - CF_ConfigTable_t config_table; + CF_Engine_t *engine_ptr = CF_GetEngine(); - CF_AppData.config_table = &config_table; - CF_AppData.config_table->ticks_per_second = ticks_per_second; + engine_ptr->config.ticks_per_second = ticks_per_second; /* Act */ UtAssert_UINT32_EQ(CF_Timer_Sec2Ticks(arg_sec), arg_sec * ticks_per_second); @@ -66,16 +65,15 @@ void Test_CF_Timer_Sec2Ticks_ReturnExpectedValue(void) void Test_CF_Timer_InitRelSec_ReceiveExpectedValue(void) { /* Arrange */ - uint32 arg_rel_sec = Any_uint32(); - CF_Timer_t timer; - CF_Timer_t *arg_t = &timer; + uint32 arg_rel_sec = Any_uint32(); + CF_Timer_t timer; + CF_Timer_t *arg_t = &timer; + CF_Engine_t *engine_ptr = CF_GetEngine(); /* Arrange unstubbalbe: CF_Timer_Sec2Ticks in same file */ - uint32 ticks_per_second = Any_uint32(); - CF_ConfigTable_t config_table; + uint32 ticks_per_second = Any_uint32(); - CF_AppData.config_table = &config_table; - CF_AppData.config_table->ticks_per_second = ticks_per_second; + engine_ptr->config.ticks_per_second = ticks_per_second; arg_t->tick = ticks_per_second; diff --git a/unit-test/cf_utils_tests.c b/unit-test/cf_utils_tests.c index 97efd604..4f37ba4e 100644 --- a/unit-test/cf_utils_tests.c +++ b/unit-test/cf_utils_tests.c @@ -113,14 +113,15 @@ void Test_CF_ResetHistory(void) /* Test case for: * void CF_ResetHistory(CF_Channel_t *chan, CF_History_t *history) */ - CF_History_t history; + CF_History_t history; + CF_Channel_t *chan = UT_CFDP_CHANNEL_PTR; memset(&history, 0, sizeof(history)); - CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].q_size[CF_QueueIdx_HIST] = 4; + chan->stat.q_size[CF_QueueIdx_HIST] = 4; /* nominal call */ - UtAssert_VOIDCALL(CF_ResetHistory(&CF_AppData.engine.channels[UT_CFDP_CHANNEL], &history)); + UtAssert_VOIDCALL(CF_ResetHistory(chan, &history)); } void Test_CF_FindUnusedTransaction(void) @@ -135,10 +136,10 @@ void Test_CF_FindUnusedTransaction(void) memset(&hist, 0, sizeof(hist)); memset(&txn, 0, sizeof(txn)); memset(&CF_AppData, 0, sizeof(CF_AppData)); - chan = &CF_AppData.engine.channels[UT_CFDP_CHANNEL]; - CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].q_size[CF_QueueIdx_FREE] = 2; - CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].q_size[CF_QueueIdx_HIST_FREE] = 1; - CF_AppData.hk.Payload.channel_hk[UT_CFDP_CHANNEL].q_size[CF_QueueIdx_HIST] = 1; + chan = UT_CFDP_CHANNEL_PTR; + chan->stat.q_size[CF_QueueIdx_FREE] = 2; + chan->stat.q_size[CF_QueueIdx_HIST_FREE] = 1; + chan->stat.q_size[CF_QueueIdx_HIST] = 1; UtAssert_NULL(CF_FindUnusedTransaction(chan, 0)); @@ -161,15 +162,17 @@ void Test_CF_FreeTransaction(void) * void CF_FreeTransaction(CF_Transaction_t *txn, uint8 chan) */ CF_Transaction_t *txn; + CF_Engine_t *engine_ptr = CF_GetEngine(); memset(&CF_AppData, 0, sizeof(CF_AppData)); - txn = &CF_AppData.engine.transactions[UT_CFDP_CHANNEL]; + txn = &engine_ptr->transactions[0]; txn->flags.com.q_index = CF_QueueIdx_RX; + txn->chan_ptr = UT_CFDP_CHANNEL_PTR; - UtAssert_VOIDCALL(CF_FreeTransaction(txn, UT_CFDP_CHANNEL)); + UtAssert_VOIDCALL(CF_FreeTransaction(txn)); UtAssert_UINT32_EQ(txn->state, CF_TxnState_UNDEF); - UtAssert_UINT8_EQ(txn->chan_num, UT_CFDP_CHANNEL); + UtAssert_ADDRESS_EQ(CF_GetChannelFromTxn(txn), UT_CFDP_CHANNEL_PTR); UtAssert_STUB_COUNT(CF_CList_InsertBack, 1); } @@ -186,7 +189,8 @@ void Test_CF_FindTransactionBySequenceNumber_Impl(void) memset(&hist, 0, sizeof(hist)); memset(&ctxt, 0, sizeof(ctxt)); - txn.history = &hist; + txn.history = &hist; + txn.chan_ptr = UT_CFDP_CHANNEL_PTR; /* non-matching eid and non-matching sequence */ hist.src_eid = 12; @@ -230,14 +234,15 @@ void Test_CF_FindTransactionBySequenceNumber(void) CF_Transaction_t *txn; CF_Channel_t *chan; + CF_Engine_t *engine_ptr = CF_GetEngine(); memset(&CF_AppData, 0, sizeof(CF_AppData)); - chan = &CF_AppData.engine.channels[UT_CFDP_CHANNEL]; + chan = UT_CFDP_CHANNEL_PTR; UtAssert_NULL(CF_FindTransactionBySequenceNumber(chan, 12, 34)); UtAssert_STUB_COUNT(CF_CList_Traverse, 3); /* this checks 3 different queues: RX, TX, PEND */ - txn = &CF_AppData.engine.transactions[UT_CFDP_CHANNEL]; + txn = &engine_ptr->transactions[0]; UT_SetHandlerFunction(UT_KEY(CF_CList_Traverse), UT_AltHandler_CF_CList_Traverse_SeqArg_SetTxn, txn); UtAssert_ADDRESS_EQ(CF_FindTransactionBySequenceNumber(chan, 12, 34), txn); } @@ -251,9 +256,10 @@ void Test_CF_GetChannelFromTxn(void) memset(&txn, 0, sizeof(txn)); + txn.chan_ptr = UT_CFDP_CHANNEL_PTR; UtAssert_NOT_NULL(CF_GetChannelFromTxn(&txn)); - txn.chan_num = CF_NUM_CHANNELS + 1; + txn.chan_ptr = NULL; UtAssert_NULL(CF_GetChannelFromTxn(&txn)); } @@ -262,7 +268,7 @@ void Test_CF_GetChunkListHead(void) /* Test case for: * CF_CListNode_t **CF_GetChunkListHead(CF_Channel_t *chan, uint8 direction) */ - CF_Channel_t *chan = CF_AppData.engine.channels; + CF_Channel_t *chan = UT_CFDP_CHANNEL_PTR; UtAssert_NULL(CF_GetChunkListHead(NULL, CF_Direction_RX)); UtAssert_NULL(CF_GetChunkListHead(chan, CF_Direction_NUM)); @@ -304,12 +310,13 @@ void Test_CF_CFDP_GetTxnStatus(void) void Test_cf_dequeue_transaction_Call_CF_CList_Remove_AndDecrement_q_size(void) { /* Arrange */ - CF_Transaction_t arg_t; - uint8 chan_num = Any_uint8_LessThan(CF_NUM_CHANNELS); - CF_CListNode_t **expected_head; - CF_CListNode_t *expected_cl_node; - uint16 initial_q_size = Any_uint16_Except(0); /* 0 will CF_Assert */ - uint16 updated_q_size; + CF_Transaction_t arg_t; + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); + CF_CListNode_t **expected_head; + CF_CListNode_t *expected_cl_node; + uint16 initial_q_size = Any_uint16_Except(0); /* 0 will CF_Assert */ + uint16 updated_q_size; CF_CList_Remove_context_t context_clist_remove; @@ -317,16 +324,16 @@ void Test_cf_dequeue_transaction_Call_CF_CList_Remove_AndDecrement_q_size(void) UT_SetDataBuffer(UT_KEY(CF_CList_Remove), &context_clist_remove, sizeof(context_clist_remove), false); - arg_t.chan_num = chan_num; - expected_head = &CF_AppData.engine.channels[arg_t.chan_num].qs[arg_t.flags.com.q_index]; + arg_t.chan_ptr = chan; + expected_head = &chan->qs[arg_t.flags.com.q_index]; expected_cl_node = &arg_t.cl_node; - CF_AppData.hk.Payload.channel_hk[arg_t.chan_num].q_size[arg_t.flags.com.q_index] = initial_q_size; + chan->stat.q_size[arg_t.flags.com.q_index] = initial_q_size; /* Act */ CF_DequeueTransaction(&arg_t); - updated_q_size = CF_AppData.hk.Payload.channel_hk[arg_t.chan_num].q_size[arg_t.flags.com.q_index]; + updated_q_size = chan->stat.q_size[arg_t.flags.com.q_index]; /* Assert */ UtAssert_ADDRESS_EQ(context_clist_remove.head, expected_head); @@ -344,7 +351,8 @@ void Test_cf_move_transaction_Call_CF_CList_InsertBack_AndSet_q_index_ToGiven_q( /* Arrange */ CF_Transaction_t txn; CF_Transaction_t *arg_t = &txn; - uint8 chan_num = Any_uint8_LessThan(CF_NUM_CHANNELS); + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); CF_CListNode_t **expected_remove_head; CF_CListNode_t *expected_remove_node; CF_CListNode_t **expected_insert_back_head; @@ -355,20 +363,20 @@ void Test_cf_move_transaction_Call_CF_CList_InsertBack_AndSet_q_index_ToGiven_q( memset(&txn, 0, sizeof(txn)); - arg_t->chan_num = chan_num; + arg_t->chan_ptr = chan; UT_SetDataBuffer(UT_KEY(CF_CList_Remove), &context_clist_remove, sizeof(context_clist_remove), false); - expected_remove_head = &CF_AppData.engine.channels[arg_t->chan_num].qs[arg_t->flags.com.q_index]; + expected_remove_head = &chan->qs[arg_t->flags.com.q_index]; expected_remove_node = &arg_t->cl_node; UT_SetDataBuffer(UT_KEY(CF_CList_InsertBack), &context_clist_insert_back, sizeof(context_clist_insert_back), false); - expected_insert_back_head = &CF_AppData.engine.channels[arg_t->chan_num].qs[arg_q]; + expected_insert_back_head = &chan->qs[arg_q]; expected_insert_back_node = &arg_t->cl_node; /* Queue size needs to be >= 1 */ - CF_AppData.hk.Payload.channel_hk[arg_t->chan_num].q_size[arg_t->flags.com.q_index] = 1; + chan->stat.q_size[arg_t->flags.com.q_index] = 1; /* Act */ CF_MoveTransaction(arg_t, arg_q); @@ -391,14 +399,15 @@ void Test_cf_move_transaction_Call_CF_CList_InsertBack_AndSet_q_index_ToGiven_q( void Test_CF_CList_Remove_Ex_Call_CF_CList_Remove_AndDecrement_q_size(void) { /* Arrange */ - CF_Channel_t *arg_c = &CF_AppData.engine.channels[Any_uint32_LessThan(CF_NUM_CHANNELS)]; - CF_QueueIdx_t arg_index = Any_cf_queue_index_t(); - CF_CListNode_t node; - CF_CListNode_t *arg_node = &node; - CF_CListNode_t **expected_remove_head; - CF_CListNode_t *expected_remove_node; - uint16 initial_q_size = Any_uint16_Except(0); - uint16 updated_q_size; + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + CF_Channel_t *arg_c = CF_GetChannelPtr(chan_num); + CF_QueueIdx_t arg_index = Any_cf_queue_index_t(); + CF_CListNode_t node; + CF_CListNode_t *arg_node = &node; + CF_CListNode_t **expected_remove_head; + CF_CListNode_t *expected_remove_node; + uint16 initial_q_size = Any_uint16_Except(0); + uint16 updated_q_size; CF_CList_Remove_context_t context_clist_remove; @@ -407,12 +416,12 @@ void Test_CF_CList_Remove_Ex_Call_CF_CList_Remove_AndDecrement_q_size(void) expected_remove_head = &arg_c->qs[arg_index]; expected_remove_node = arg_node; - CF_AppData.hk.Payload.channel_hk[arg_c - CF_AppData.engine.channels].q_size[arg_index] = initial_q_size; + arg_c->stat.q_size[arg_index] = initial_q_size; /* Act */ CF_CList_Remove_Ex(arg_c, arg_index, arg_node); - updated_q_size = CF_AppData.hk.Payload.channel_hk[arg_c - CF_AppData.engine.channels].q_size[arg_index]; + updated_q_size = arg_c->stat.q_size[arg_index]; /* Assert */ UtAssert_STUB_COUNT(CF_CList_Remove, 1); @@ -429,15 +438,16 @@ void Test_CF_CList_Remove_Ex_Call_CF_CList_Remove_AndDecrement_q_size(void) void Test_CF_CList_InsertAfter_Ex_Call_CF_CList_InsertAfter_AndIncrement_q_size(void) { /* Arrange */ - CF_Channel_t *arg_c = &CF_AppData.engine.channels[Any_uint32_LessThan(CF_NUM_CHANNELS)]; - CF_QueueIdx_t arg_index = Any_cf_queue_index_t(); - CF_CListNode_t start; - CF_CListNode_t *arg_start = &start; - CF_CListNode_t after; - CF_CListNode_t *arg_after = &after; - CF_CListNode_t **expected_insert_after_head = &arg_c->qs[arg_index]; - uint16 initial_q_size = Any_uint16(); - uint16 updated_q_size; + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + CF_Channel_t *arg_c = CF_GetChannelPtr(chan_num); + CF_QueueIdx_t arg_index = Any_cf_queue_index_t(); + CF_CListNode_t start; + CF_CListNode_t *arg_start = &start; + CF_CListNode_t after; + CF_CListNode_t *arg_after = &after; + CF_CListNode_t **expected_insert_after_head = &arg_c->qs[arg_index]; + uint16 initial_q_size = Any_uint16(); + uint16 updated_q_size; CF_CList_InsertAfter_context_t context_CF_CList_InsertAfter; @@ -446,12 +456,12 @@ void Test_CF_CList_InsertAfter_Ex_Call_CF_CList_InsertAfter_AndIncrement_q_size( sizeof(context_CF_CList_InsertAfter), false); - CF_AppData.hk.Payload.channel_hk[arg_c - CF_AppData.engine.channels].q_size[arg_index] = initial_q_size; + arg_c->stat.q_size[arg_index] = initial_q_size; /* Act */ CF_CList_InsertAfter_Ex(arg_c, arg_index, arg_start, arg_after); - updated_q_size = CF_AppData.hk.Payload.channel_hk[arg_c - CF_AppData.engine.channels].q_size[arg_index]; + updated_q_size = arg_c->stat.q_size[arg_index]; /* Assert */ UtAssert_STUB_COUNT(CF_CList_InsertAfter, 1); @@ -469,14 +479,15 @@ void Test_CF_CList_InsertAfter_Ex_Call_CF_CList_InsertAfter_AndIncrement_q_size( void Test_CF_CList_InsertBack_Ex_Call_CF_CList_InsertBack_AndIncrement_q_size(void) { /* Arrange */ - CF_Channel_t *arg_c = &CF_AppData.engine.channels[Any_uint32_LessThan(CF_NUM_CHANNELS)]; - CF_QueueIdx_t arg_index = Any_cf_queue_index_t(); - CF_CListNode_t node; - CF_CListNode_t *arg_node = &node; - uint16 initial_q_size = Any_uint16(); - CF_CListNode_t **expected_insert_back_head; - CF_CListNode_t *expected_insert_back_node; - uint16 updated_q_size; + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + CF_Channel_t *arg_c = CF_GetChannelPtr(chan_num); + CF_QueueIdx_t arg_index = Any_cf_queue_index_t(); + CF_CListNode_t node; + CF_CListNode_t *arg_node = &node; + uint16 initial_q_size = Any_uint16(); + CF_CListNode_t **expected_insert_back_head; + CF_CListNode_t *expected_insert_back_node; + uint16 updated_q_size; CF_CList_InsertBack_context_t context_clist_insert_back; UT_SetDataBuffer(UT_KEY(CF_CList_InsertBack), &context_clist_insert_back, sizeof(context_clist_insert_back), false); @@ -484,12 +495,12 @@ void Test_CF_CList_InsertBack_Ex_Call_CF_CList_InsertBack_AndIncrement_q_size(vo expected_insert_back_head = &arg_c->qs[arg_index]; expected_insert_back_node = arg_node; - CF_AppData.hk.Payload.channel_hk[arg_c - CF_AppData.engine.channels].q_size[arg_index] = initial_q_size; + arg_c->stat.q_size[arg_index] = initial_q_size; /* Act */ CF_CList_InsertBack_Ex(arg_c, arg_index, arg_node); - updated_q_size = CF_AppData.hk.Payload.channel_hk[arg_c - CF_AppData.engine.channels].q_size[arg_index]; + updated_q_size = arg_c->stat.q_size[arg_index]; /* Assert */ UtAssert_STUB_COUNT(CF_CList_InsertBack, 1); @@ -710,24 +721,24 @@ void Test_CF_PrioSearch_When_t_PrioIsLessThanContextPrio_Set_context_t_To_t_AndR void Test_CF_InsertSortPrio_Call_CF_CList_InsertBack_Ex_ListIsEmpty_AndSet_q_index_To_q(void) { /* Arrange */ - CF_Transaction_t txn; - CF_Transaction_t *arg_t = &txn; - CF_QueueIdx_t arg_q = Any_cf_queue_index_t(); - CF_Channel_t *chan; - CF_CListNode_t **expected_insert_back_head; - CF_CListNode_t *expected_insert_back_node; + CF_Transaction_t txn; + CF_Transaction_t *arg_t = &txn; + CF_QueueIdx_t arg_q = Any_cf_queue_index_t(); + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); + CF_CListNode_t **expected_insert_back_head; + CF_CListNode_t *expected_insert_back_node; CF_CList_InsertBack_context_t context_clist_insert_back; /* txn settings to bypass CF_Assert */ - txn.chan_num = Any_uint8_LessThan(CF_NUM_CHANNELS); + txn.chan_ptr = chan; txn.state = Any_uint8_Except(CF_TxnState_INIT); UT_SetDataBuffer(UT_KEY(CF_CList_InsertBack), &context_clist_insert_back, sizeof(context_clist_insert_back), false); - /* setting (&CF_AppData.engine.channels[arg_t->chan_num])->qs[arg_q] to NULL + /* setting (&engine_ptr->channels[arg_t->chan_num])->qs[arg_q] to NULL * makes the list empty */ - chan = &CF_AppData.engine.channels[arg_t->chan_num]; chan->qs[arg_q] = NULL; expected_insert_back_head = &chan->qs[arg_q]; @@ -749,17 +760,18 @@ void Test_CF_InsertSortPrio_Call_CF_CList_InsertBack_Ex_ListIsEmpty_AndSet_q_ind void Test_CF_InsertSortPrio_Call_CF_CList_InsertAfter_Ex_AndSet_q_index_To_q(void) { /* Arrange */ - CF_Transaction_t p_t; - CF_Transaction_t txn; - CF_Transaction_t *arg_t = &txn; - CF_QueueIdx_t arg_q = Any_cf_queue_index_t(); - CF_CListNode_t *qs; - CF_Channel_t *chan; - CF_CListNode_t *expected_end; - CF_CListFn_t expected_fn; - CF_CListNode_t **expected_insert_after_head; - CF_CListNode_t **expected_insert_after_start; - CF_CListNode_t **expected_insert_after_after; + CF_Transaction_t p_t; + CF_Transaction_t txn; + CF_Transaction_t *arg_t = &txn; + CF_QueueIdx_t arg_q = Any_cf_queue_index_t(); + CF_CListNode_t *qs; + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); + CF_CListNode_t *expected_end; + CF_CListFn_t expected_fn; + CF_CListNode_t **expected_insert_after_head; + CF_CListNode_t **expected_insert_after_start; + CF_CListNode_t **expected_insert_after_after; CF_CList_Traverse_R_context_t context_cf_clist_traverse_r; CF_CList_InsertAfter_context_t context_CF_CList_InsertAfter; @@ -769,12 +781,11 @@ void Test_CF_InsertSortPrio_Call_CF_CList_InsertAfter_Ex_AndSet_q_index_To_q(voi &context_cf_clist_traverse_r); /* txn settings to bypass CF_Assert */ - txn.chan_num = Any_uint8_LessThan(CF_NUM_CHANNELS); + txn.chan_ptr = chan; txn.state = Any_uint8_Except(CF_TxnState_INIT); - /* setting (&CF_AppData.engine.channels[arg_t->chan_num])->qs[arg_q] to + /* setting (&engine_ptr->channels[arg_t->chan_num])->qs[arg_q] to * &qs makes the list NOT empty */ - chan = &CF_AppData.engine.channels[arg_t->chan_num]; chan->qs[arg_q] = (CF_CListNode_t *)&qs; /* setup CF_Traverse_PriorityArg_t altered value */ @@ -813,15 +824,16 @@ void Test_CF_InsertSortPrio_Call_CF_CList_InsertAfter_Ex_AndSet_q_index_To_q(voi void Test_CF_InsertSortPrio_When_p_t_Is_NULL_Call_CF_CList_InsertBack_Ex(void) { /* Arrange */ - CF_Transaction_t txn; - CF_Transaction_t *arg_t = &txn; - CF_QueueIdx_t arg_q = Any_cf_queue_index_t(); - CF_CListNode_t *qs; - CF_Channel_t *chan; - CF_CListNode_t *expected_end; - CF_CListFn_t expected_fn; - CF_CListNode_t **expected_insert_back_head; - CF_CListNode_t *expected_insert_back_node; + CF_Transaction_t txn; + CF_Transaction_t *arg_t = &txn; + CF_QueueIdx_t arg_q = Any_cf_queue_index_t(); + CF_CListNode_t *qs; + CF_ChannelSelect_t chan_num = Any_cf_chan_num(); + CF_Channel_t *chan = CF_GetChannelPtr(chan_num); + CF_CListNode_t *expected_end; + CF_CListFn_t expected_fn; + CF_CListNode_t **expected_insert_back_head; + CF_CListNode_t *expected_insert_back_node; CF_CList_Traverse_R_context_t context_cf_clist_traverse_r; CF_CList_InsertBack_context_t context_clist_insert_back; @@ -832,12 +844,11 @@ void Test_CF_InsertSortPrio_When_p_t_Is_NULL_Call_CF_CList_InsertBack_Ex(void) false); /* txn settings to bypass CF_Assert */ - txn.chan_num = Any_uint8_LessThan(CF_NUM_CHANNELS); + txn.chan_ptr = chan; txn.state = Any_uint8_Except(CF_TxnState_INIT); - /* setting (&CF_AppData.engine.channels[arg_t->chan_num])->qs[arg_q] to + /* setting (&engine_ptr->channels[arg_t->chan_num])->qs[arg_q] to * &qs makes the list NOT empty */ - chan = &CF_AppData.engine.channels[arg_t->chan_num]; chan->qs[arg_q] = (CF_CListNode_t *)&qs; /* setup CF_Traverse_PriorityArg_t altered value */ @@ -1184,6 +1195,33 @@ void Test_CF_TxnStatus_From_ConditionCode(void) } } +static int32 CF_UT_ChannelFunc(CF_Engine_t *engine_ptr, CF_Channel_t *chan, void *arg) +{ + return UT_DEFAULT_IMPL(CF_UT_ChannelFunc); +} + +void Test_CF_ForEachChannel(void) +{ + /* Test function for: + * int32 CF_ForEachChannel(CF_Engine_t *engine_ptr, CF_ChannelFunc_t fn, void *arg) + */ + CF_Engine_t *engine_ptr = CF_GetEngine(); + + UT_ResetState(UT_KEY(CF_UT_ChannelFunc)); + UtAssert_INT32_EQ(CF_ForEachChannel(engine_ptr, CF_UT_ChannelFunc, NULL), CFE_SUCCESS); + UtAssert_STUB_COUNT(CF_UT_ChannelFunc, CF_NUM_CHANNELS); + + UT_ResetState(UT_KEY(CF_UT_ChannelFunc)); + UT_SetDeferredRetcode(UT_KEY(CF_UT_ChannelFunc), 1, -1); + UtAssert_INT32_EQ(CF_ForEachChannel(engine_ptr, CF_UT_ChannelFunc, NULL), -1); + UtAssert_STUB_COUNT(CF_UT_ChannelFunc, 1); + + UT_ResetState(UT_KEY(CF_UT_ChannelFunc)); + UT_SetDeferredRetcode(UT_KEY(CF_UT_ChannelFunc), CF_NUM_CHANNELS, -1); + UtAssert_INT32_EQ(CF_ForEachChannel(engine_ptr, CF_UT_ChannelFunc, NULL), -1); + UtAssert_STUB_COUNT(CF_UT_ChannelFunc, CF_NUM_CHANNELS); +} + /******************************************************************************* ** ** cf_utils_tests UtTest_Add groups @@ -1427,4 +1465,6 @@ void UtTest_Setup(void) add_CF_WrappedWrite_tests(); add_CF_WrappedLseek_tests(); + + UtTest_Add(Test_CF_ForEachChannel, cf_utils_tests_Setup, cf_utils_tests_Teardown, "Test_CF_ForEachChannel"); } diff --git a/unit-test/stubs/cf_cfdp_handlers.c b/unit-test/stubs/cf_cfdp_handlers.c index f41613a0..483ecf31 100644 --- a/unit-test/stubs/cf_cfdp_handlers.c +++ b/unit-test/stubs/cf_cfdp_handlers.c @@ -80,7 +80,7 @@ void UT_DefaultHandler_CF_CFDP_TxFile(void *UserObj, UT_EntryKey_t FuncKey, cons strncpy(ctxt->dst_filename, ptr, sizeof(ctxt->dst_filename)); ctxt->cfdp_class = UT_Hook_GetArgValueByName(Context, "cfdp_class", CF_CFDP_Class_t); ctxt->keep = UT_Hook_GetArgValueByName(Context, "keep", uint8); - ctxt->chan = UT_Hook_GetArgValueByName(Context, "chan", uint8); + ctxt->chan = UT_Hook_GetArgValueByName(Context, "chan", CF_Channel_t *); ctxt->priority = UT_Hook_GetArgValueByName(Context, "priority", uint8); ctxt->dest_id = UT_Hook_GetArgValueByName(Context, "dest_id", CF_EntityId_t); } @@ -105,7 +105,7 @@ void UT_DefaultHandler_CF_CFDP_PlaybackDir(void *UserObj, UT_EntryKey_t FuncKey, strncpy(ctxt->dst_filename, ptr, sizeof(ctxt->dst_filename)); ctxt->cfdp_class = UT_Hook_GetArgValueByName(Context, "cfdp_class", CF_CFDP_Class_t); ctxt->keep = UT_Hook_GetArgValueByName(Context, "keep", uint8); - ctxt->chan = UT_Hook_GetArgValueByName(Context, "chan", uint8); + ctxt->chan = UT_Hook_GetArgValueByName(Context, "chan", CF_Channel_t *); ctxt->priority = UT_Hook_GetArgValueByName(Context, "priority", uint8); ctxt->dest_id = UT_Hook_GetArgValueByName(Context, "dest_id", uint16); } diff --git a/unit-test/stubs/cf_cfdp_s_stubs.c b/unit-test/stubs/cf_cfdp_s_stubs.c index e6e49f7b..9a17e0ad 100644 --- a/unit-test/stubs/cf_cfdp_s_stubs.c +++ b/unit-test/stubs/cf_cfdp_s_stubs.c @@ -39,6 +39,19 @@ void CF_CFDP_S1_Recv(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) UT_GenStub_Execute(CF_CFDP_S1_Recv, Basic, NULL); } +/* + * ---------------------------------------------------- + * Generated stub function for CF_CFDP_S2_Recv() + * ---------------------------------------------------- + */ +void CF_CFDP_S2_Recv(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) +{ + UT_GenStub_AddParam(CF_CFDP_S2_Recv, CF_Transaction_t *, txn); + UT_GenStub_AddParam(CF_CFDP_S2_Recv, CF_Logical_PduBuffer_t *, ph); + + UT_GenStub_Execute(CF_CFDP_S2_Recv, Basic, NULL); +} + /* * ---------------------------------------------------- * Generated stub function for CF_CFDP_S2_SubstateEofAck() @@ -65,19 +78,6 @@ void CF_CFDP_S2_SubstateNak(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) UT_GenStub_Execute(CF_CFDP_S2_SubstateNak, Basic, NULL); } -/* - * ---------------------------------------------------- - * Generated stub function for CF_CFDP_S2_Recv() - * ---------------------------------------------------- - */ -void CF_CFDP_S2_Recv(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) -{ - UT_GenStub_AddParam(CF_CFDP_S2_Recv, CF_Transaction_t *, txn); - UT_GenStub_AddParam(CF_CFDP_S2_Recv, CF_Logical_PduBuffer_t *, ph); - - UT_GenStub_Execute(CF_CFDP_S2_Recv, Basic, NULL); -} - /* * ---------------------------------------------------- * Generated stub function for CF_CFDP_S_AckTimerTick() @@ -102,32 +102,6 @@ void CF_CFDP_S_CheckState(CF_Transaction_t *txn) UT_GenStub_Execute(CF_CFDP_S_CheckState, Basic, NULL); } -/* - * ---------------------------------------------------- - * Generated stub function for CF_CFDP_S_SubstateEarlyFin() - * ---------------------------------------------------- - */ -void CF_CFDP_S_SubstateEarlyFin(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) -{ - UT_GenStub_AddParam(CF_CFDP_S_SubstateEarlyFin, CF_Transaction_t *, txn); - UT_GenStub_AddParam(CF_CFDP_S_SubstateEarlyFin, CF_Logical_PduBuffer_t *, ph); - - UT_GenStub_Execute(CF_CFDP_S_SubstateEarlyFin, Basic, NULL); -} - -/* - * ---------------------------------------------------- - * Generated stub function for CF_CFDP_S_SubstateRecvFin() - * ---------------------------------------------------- - */ -void CF_CFDP_S_SubstateRecvFin(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) -{ - UT_GenStub_AddParam(CF_CFDP_S_SubstateRecvFin, CF_Transaction_t *, txn); - UT_GenStub_AddParam(CF_CFDP_S_SubstateRecvFin, CF_Logical_PduBuffer_t *, ph); - - UT_GenStub_Execute(CF_CFDP_S_SubstateRecvFin, Basic, NULL); -} - /* * ---------------------------------------------------- * Generated stub function for CF_CFDP_S_HandleFileRetention() @@ -171,6 +145,32 @@ CFE_Status_t CF_CFDP_S_SendFileData(CF_Transaction_t *txn, uint32 foffs, uint32 return UT_GenStub_GetReturnValue(CF_CFDP_S_SendFileData, CFE_Status_t); } +/* + * ---------------------------------------------------- + * Generated stub function for CF_CFDP_S_SubstateEarlyFin() + * ---------------------------------------------------- + */ +void CF_CFDP_S_SubstateEarlyFin(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) +{ + UT_GenStub_AddParam(CF_CFDP_S_SubstateEarlyFin, CF_Transaction_t *, txn); + UT_GenStub_AddParam(CF_CFDP_S_SubstateEarlyFin, CF_Logical_PduBuffer_t *, ph); + + UT_GenStub_Execute(CF_CFDP_S_SubstateEarlyFin, Basic, NULL); +} + +/* + * ---------------------------------------------------- + * Generated stub function for CF_CFDP_S_SubstateRecvFin() + * ---------------------------------------------------- + */ +void CF_CFDP_S_SubstateRecvFin(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) +{ + UT_GenStub_AddParam(CF_CFDP_S_SubstateRecvFin, CF_Transaction_t *, txn); + UT_GenStub_AddParam(CF_CFDP_S_SubstateRecvFin, CF_Logical_PduBuffer_t *, ph); + + UT_GenStub_Execute(CF_CFDP_S_SubstateRecvFin, Basic, NULL); +} + /* * ---------------------------------------------------- * Generated stub function for CF_CFDP_S_SubstateSendFileData() diff --git a/unit-test/stubs/cf_cfdp_sbintf_stubs.c b/unit-test/stubs/cf_cfdp_sbintf_stubs.c index afd26193..af649ced 100644 --- a/unit-test/stubs/cf_cfdp_sbintf_stubs.c +++ b/unit-test/stubs/cf_cfdp_sbintf_stubs.c @@ -62,9 +62,9 @@ void CF_CFDP_ReceiveMessage(CF_Channel_t *chan) * Generated stub function for CF_CFDP_Send() * ---------------------------------------------------- */ -void CF_CFDP_Send(uint8 chan_num, const CF_Logical_PduBuffer_t *ph) +void CF_CFDP_Send(CF_Channel_t *chan_ptr, const CF_Logical_PduBuffer_t *ph) { - UT_GenStub_AddParam(CF_CFDP_Send, uint8, chan_num); + UT_GenStub_AddParam(CF_CFDP_Send, CF_Channel_t *, chan_ptr); UT_GenStub_AddParam(CF_CFDP_Send, const CF_Logical_PduBuffer_t *, ph); UT_GenStub_Execute(CF_CFDP_Send, Basic, NULL); diff --git a/unit-test/stubs/cf_cfdp_stubs.c b/unit-test/stubs/cf_cfdp_stubs.c index 79c35255..a856756f 100644 --- a/unit-test/stubs/cf_cfdp_stubs.c +++ b/unit-test/stubs/cf_cfdp_stubs.c @@ -341,10 +341,12 @@ CF_TxnStatus_t CF_CFDP_GetTxnStatus(const CF_Transaction_t *txn) * Generated stub function for CF_CFDP_InitEngine() * ---------------------------------------------------- */ -CFE_Status_t CF_CFDP_InitEngine(void) +CFE_Status_t CF_CFDP_InitEngine(CF_Engine_t *engine_ptr) { UT_GenStub_SetupReturnBuffer(CF_CFDP_InitEngine, CFE_Status_t); + UT_GenStub_AddParam(CF_CFDP_InitEngine, CF_Engine_t *, engine_ptr); + UT_GenStub_Execute(CF_CFDP_InitEngine, Basic, NULL); return UT_GenStub_GetReturnValue(CF_CFDP_InitEngine, CFE_Status_t); @@ -355,12 +357,16 @@ CFE_Status_t CF_CFDP_InitEngine(void) * Generated stub function for CF_CFDP_InitTxnTxFile() * ---------------------------------------------------- */ -void CF_CFDP_InitTxnTxFile(CF_Transaction_t *txn, CF_CFDP_Class_t cfdp_class, uint8 keep, uint8 chan, uint8 priority) +void CF_CFDP_InitTxnTxFile(CF_Transaction_t *txn, + CF_CFDP_Class_t cfdp_class, + uint8 keep, + CF_Channel_t *chan, + uint8 priority) { UT_GenStub_AddParam(CF_CFDP_InitTxnTxFile, CF_Transaction_t *, txn); UT_GenStub_AddParam(CF_CFDP_InitTxnTxFile, CF_CFDP_Class_t, cfdp_class); UT_GenStub_AddParam(CF_CFDP_InitTxnTxFile, uint8, keep); - UT_GenStub_AddParam(CF_CFDP_InitTxnTxFile, uint8, chan); + UT_GenStub_AddParam(CF_CFDP_InitTxnTxFile, CF_Channel_t *, chan); UT_GenStub_AddParam(CF_CFDP_InitTxnTxFile, uint8, priority); UT_GenStub_Execute(CF_CFDP_InitTxnTxFile, Basic, NULL); @@ -375,7 +381,7 @@ CFE_Status_t CF_CFDP_PlaybackDir(const char *src_filename, const char *dst_filename, CF_CFDP_Class_t cfdp_class, uint8 keep, - uint8 chan, + CF_Channel_t *chan, uint8 priority, uint16 dest_id) { @@ -385,7 +391,7 @@ CFE_Status_t CF_CFDP_PlaybackDir(const char *src_filename, UT_GenStub_AddParam(CF_CFDP_PlaybackDir, const char *, dst_filename); UT_GenStub_AddParam(CF_CFDP_PlaybackDir, CF_CFDP_Class_t, cfdp_class); UT_GenStub_AddParam(CF_CFDP_PlaybackDir, uint8, keep); - UT_GenStub_AddParam(CF_CFDP_PlaybackDir, uint8, chan); + UT_GenStub_AddParam(CF_CFDP_PlaybackDir, CF_Channel_t *, chan); UT_GenStub_AddParam(CF_CFDP_PlaybackDir, uint8, priority); UT_GenStub_AddParam(CF_CFDP_PlaybackDir, uint16, dest_id); @@ -578,11 +584,11 @@ CFE_Status_t CF_CFDP_RecvNak(CF_Transaction_t *txn, CF_Logical_PduBuffer_t *ph) * Generated stub function for CF_CFDP_RecvPh() * ---------------------------------------------------- */ -CFE_Status_t CF_CFDP_RecvPh(uint8 chan_num, CF_Logical_PduBuffer_t *ph) +CFE_Status_t CF_CFDP_RecvPh(CF_Channel_t *chan, CF_Logical_PduBuffer_t *ph) { UT_GenStub_SetupReturnBuffer(CF_CFDP_RecvPh, CFE_Status_t); - UT_GenStub_AddParam(CF_CFDP_RecvPh, uint8, chan_num); + UT_GenStub_AddParam(CF_CFDP_RecvPh, CF_Channel_t *, chan); UT_GenStub_AddParam(CF_CFDP_RecvPh, CF_Logical_PduBuffer_t *, ph); UT_GenStub_Execute(CF_CFDP_RecvPh, Basic, NULL); @@ -780,11 +786,11 @@ bool CF_CFDP_StartFirstPending(CF_Channel_t *chan) * Generated stub function for CF_CFDP_StartRxTransaction() * ---------------------------------------------------- */ -CF_Transaction_t *CF_CFDP_StartRxTransaction(uint8 chan_num) +CF_Transaction_t *CF_CFDP_StartRxTransaction(CF_Channel_t *chan) { UT_GenStub_SetupReturnBuffer(CF_CFDP_StartRxTransaction, CF_Transaction_t *); - UT_GenStub_AddParam(CF_CFDP_StartRxTransaction, uint8, chan_num); + UT_GenStub_AddParam(CF_CFDP_StartRxTransaction, CF_Channel_t *, chan); UT_GenStub_Execute(CF_CFDP_StartRxTransaction, Basic, NULL); @@ -812,7 +818,7 @@ CFE_Status_t CF_CFDP_TxFile(const char *src_filename, const char *dst_filename, CF_CFDP_Class_t cfdp_class, uint8 keep, - uint8 chan, + CF_Channel_t *chan, uint8 priority, CF_EntityId_t dest_id) { @@ -822,7 +828,7 @@ CFE_Status_t CF_CFDP_TxFile(const char *src_filename, UT_GenStub_AddParam(CF_CFDP_TxFile, const char *, dst_filename); UT_GenStub_AddParam(CF_CFDP_TxFile, CF_CFDP_Class_t, cfdp_class); UT_GenStub_AddParam(CF_CFDP_TxFile, uint8, keep); - UT_GenStub_AddParam(CF_CFDP_TxFile, uint8, chan); + UT_GenStub_AddParam(CF_CFDP_TxFile, CF_Channel_t *, chan); UT_GenStub_AddParam(CF_CFDP_TxFile, uint8, priority); UT_GenStub_AddParam(CF_CFDP_TxFile, CF_EntityId_t, dest_id); diff --git a/unit-test/stubs/cf_cmd_stubs.c b/unit-test/stubs/cf_cmd_stubs.c index bf64cb2c..887ff78a 100644 --- a/unit-test/stubs/cf_cmd_stubs.c +++ b/unit-test/stubs/cf_cmd_stubs.c @@ -138,11 +138,11 @@ CFE_Status_t CF_DisableEngineCmd(const CF_DisableEngineCmd_t *msg) * ---------------------------------------------------- */ CF_ChanAction_Status_t -CF_DoChanAction(const CF_UnionArgs_Payload_t *data, const char *errstr, CF_ChanActionFn_t fn, void *context) +CF_DoChanAction(CF_ChannelSelect_t chan_select, const char *errstr, CF_ChanActionFn_t fn, void *context) { UT_GenStub_SetupReturnBuffer(CF_DoChanAction, CF_ChanAction_Status_t); - UT_GenStub_AddParam(CF_DoChanAction, const CF_UnionArgs_Payload_t *, data); + UT_GenStub_AddParam(CF_DoChanAction, CF_ChannelSelect_t, chan_select); UT_GenStub_AddParam(CF_DoChanAction, const char *, errstr); UT_GenStub_AddParam(CF_DoChanAction, CF_ChanActionFn_t, fn); UT_GenStub_AddParam(CF_DoChanAction, void *, context); @@ -157,11 +157,11 @@ CF_DoChanAction(const CF_UnionArgs_Payload_t *data, const char *errstr, CF_ChanA * Generated stub function for CF_DoEnableDisableDequeue() * ---------------------------------------------------- */ -CF_ChanAction_Status_t CF_DoEnableDisableDequeue(uint8 chan_num, void *arg) +CF_ChanAction_Status_t CF_DoEnableDisableDequeue(CF_Channel_t *chan, void *arg) { UT_GenStub_SetupReturnBuffer(CF_DoEnableDisableDequeue, CF_ChanAction_Status_t); - UT_GenStub_AddParam(CF_DoEnableDisableDequeue, uint8, chan_num); + UT_GenStub_AddParam(CF_DoEnableDisableDequeue, CF_Channel_t *, chan); UT_GenStub_AddParam(CF_DoEnableDisableDequeue, void *, arg); UT_GenStub_Execute(CF_DoEnableDisableDequeue, Basic, NULL); @@ -174,11 +174,11 @@ CF_ChanAction_Status_t CF_DoEnableDisableDequeue(uint8 chan_num, void *arg) * Generated stub function for CF_DoEnableDisablePolldir() * ---------------------------------------------------- */ -CF_ChanAction_Status_t CF_DoEnableDisablePolldir(uint8 chan_num, void *arg) +CF_ChanAction_Status_t CF_DoEnableDisablePolldir(CF_Channel_t *chan, void *arg) { UT_GenStub_SetupReturnBuffer(CF_DoEnableDisablePolldir, CF_ChanAction_Status_t); - UT_GenStub_AddParam(CF_DoEnableDisablePolldir, uint8, chan_num); + UT_GenStub_AddParam(CF_DoEnableDisablePolldir, CF_Channel_t *, chan); UT_GenStub_AddParam(CF_DoEnableDisablePolldir, void *, arg); UT_GenStub_Execute(CF_DoEnableDisablePolldir, Basic, NULL); @@ -191,11 +191,11 @@ CF_ChanAction_Status_t CF_DoEnableDisablePolldir(uint8 chan_num, void *arg) * Generated stub function for CF_DoFreezeThaw() * ---------------------------------------------------- */ -CF_ChanAction_Status_t CF_DoFreezeThaw(uint8 chan_num, void *arg) +CF_ChanAction_Status_t CF_DoFreezeThaw(CF_Channel_t *chan, void *arg) { UT_GenStub_SetupReturnBuffer(CF_DoFreezeThaw, CF_ChanAction_Status_t); - UT_GenStub_AddParam(CF_DoFreezeThaw, uint8, chan_num); + UT_GenStub_AddParam(CF_DoFreezeThaw, CF_Channel_t *, chan); UT_GenStub_AddParam(CF_DoFreezeThaw, void *, arg); UT_GenStub_Execute(CF_DoFreezeThaw, Basic, NULL); @@ -208,11 +208,11 @@ CF_ChanAction_Status_t CF_DoFreezeThaw(uint8 chan_num, void *arg) * Generated stub function for CF_DoPurgeQueue() * ---------------------------------------------------- */ -CF_ChanAction_Status_t CF_DoPurgeQueue(uint8 chan_num, void *arg) +CF_ChanAction_Status_t CF_DoPurgeQueue(CF_Channel_t *chan, void *arg) { UT_GenStub_SetupReturnBuffer(CF_DoPurgeQueue, CF_ChanAction_Status_t); - UT_GenStub_AddParam(CF_DoPurgeQueue, uint8, chan_num); + UT_GenStub_AddParam(CF_DoPurgeQueue, CF_Channel_t *, chan); UT_GenStub_AddParam(CF_DoPurgeQueue, void *, arg); UT_GenStub_Execute(CF_DoPurgeQueue, Basic, NULL); @@ -348,12 +348,12 @@ CFE_Status_t CF_GetParamCmd(const CF_GetParamCmd_t *msg) * Generated stub function for CF_GetSetParamCmd() * ---------------------------------------------------- */ -void CF_GetSetParamCmd(bool is_set, CF_GetSet_ValueID_t param_id, uint32 value, uint8 chan_num) +void CF_GetSetParamCmd(bool is_set, CF_GetSet_ValueID_t param_id, uint32 value, CF_ChannelSelect_t chan_num) { UT_GenStub_AddParam(CF_GetSetParamCmd, bool, is_set); UT_GenStub_AddParam(CF_GetSetParamCmd, CF_GetSet_ValueID_t, param_id); UT_GenStub_AddParam(CF_GetSetParamCmd, uint32, value); - UT_GenStub_AddParam(CF_GetSetParamCmd, uint8, chan_num); + UT_GenStub_AddParam(CF_GetSetParamCmd, CF_ChannelSelect_t, chan_num); UT_GenStub_Execute(CF_GetSetParamCmd, Basic, NULL); } @@ -579,12 +579,12 @@ CFE_Status_t CF_TxFileCmd(const CF_TxFileCmd_t *msg) * Generated stub function for CF_ValidateChunkSizeCmd() * ---------------------------------------------------- */ -CF_ChanAction_Status_t CF_ValidateChunkSizeCmd(CF_ChunkSize_t val, uint8 chan_num) +CF_ChanAction_Status_t CF_ValidateChunkSizeCmd(CF_ChunkSize_t val, CF_Channel_t *chan) { UT_GenStub_SetupReturnBuffer(CF_ValidateChunkSizeCmd, CF_ChanAction_Status_t); UT_GenStub_AddParam(CF_ValidateChunkSizeCmd, CF_ChunkSize_t, val); - UT_GenStub_AddParam(CF_ValidateChunkSizeCmd, uint8, chan_num); + UT_GenStub_AddParam(CF_ValidateChunkSizeCmd, CF_Channel_t *, chan); UT_GenStub_Execute(CF_ValidateChunkSizeCmd, Basic, NULL); @@ -596,12 +596,12 @@ CF_ChanAction_Status_t CF_ValidateChunkSizeCmd(CF_ChunkSize_t val, uint8 chan_nu * Generated stub function for CF_ValidateMaxOutgoingCmd() * ---------------------------------------------------- */ -CF_ChanAction_Status_t CF_ValidateMaxOutgoingCmd(uint32 val, uint8 chan_num) +CF_ChanAction_Status_t CF_ValidateMaxOutgoingCmd(uint32 val, CF_Channel_t *chan) { UT_GenStub_SetupReturnBuffer(CF_ValidateMaxOutgoingCmd, CF_ChanAction_Status_t); UT_GenStub_AddParam(CF_ValidateMaxOutgoingCmd, uint32, val); - UT_GenStub_AddParam(CF_ValidateMaxOutgoingCmd, uint8, chan_num); + UT_GenStub_AddParam(CF_ValidateMaxOutgoingCmd, CF_Channel_t *, chan); UT_GenStub_Execute(CF_ValidateMaxOutgoingCmd, Basic, NULL); diff --git a/unit-test/stubs/cf_utils_handlers.c b/unit-test/stubs/cf_utils_handlers.c index eb65f59c..05a99148 100644 --- a/unit-test/stubs/cf_utils_handlers.c +++ b/unit-test/stubs/cf_utils_handlers.c @@ -201,3 +201,29 @@ void UT_DefaultHandler_CF_WrappedOpenCreate(void *UserObj, UT_EntryKey_t FuncKey UT_Stub_SetReturnValue(FuncKey, ctxt->forced_return); } } + +/*---------------------------------------------------------------- + * + * Function: UT_DefaultHandler_CF_ForEachChannel + * + * Invokes the passed-in, as this is usually required for correct operation + * + *-----------------------------------------------------------------*/ +void UT_DefaultHandler_CF_ForEachChannel(void *UserObj, UT_EntryKey_t FuncKey, const UT_StubContext_t *Context) +{ + CF_Engine_t *engine_ptr = UT_Hook_GetArgValueByName(Context, "engine_ptr", CF_Engine_t *); + CF_ChannelFunc_t fn = UT_Hook_GetArgValueByName(Context, "fn", CF_ChannelFunc_t); + void *arg = UT_Hook_GetArgValueByName(Context, "arg", void *); + int32 ret; + + if (fn) + { + ret = fn(engine_ptr, &engine_ptr->channels[UT_CFDP_CHANNEL_IDX], arg); + } + else + { + ret = CFE_SUCCESS; + } + + UT_Stub_SetReturnValue(FuncKey, ret); +} diff --git a/unit-test/stubs/cf_utils_stubs.c b/unit-test/stubs/cf_utils_stubs.c index c4828745..605ed2db 100644 --- a/unit-test/stubs/cf_utils_stubs.c +++ b/unit-test/stubs/cf_utils_stubs.c @@ -28,6 +28,7 @@ void UT_DefaultHandler_CF_FindTransactionBySequenceNumber(void *, UT_EntryKey_t, const UT_StubContext_t *); void UT_DefaultHandler_CF_FindUnusedTransaction(void *, UT_EntryKey_t, const UT_StubContext_t *); +void UT_DefaultHandler_CF_ForEachChannel(void *, UT_EntryKey_t, const UT_StubContext_t *); void UT_DefaultHandler_CF_ResetHistory(void *, UT_EntryKey_t, const UT_StubContext_t *); void UT_DefaultHandler_CF_TraverseAllTransactions(void *, UT_EntryKey_t, const UT_StubContext_t *); void UT_DefaultHandler_CF_TraverseAllTransactions_All_Channels(void *, UT_EntryKey_t, const UT_StubContext_t *); @@ -107,31 +108,32 @@ CF_Transaction_t *CF_FindUnusedTransaction(CF_Channel_t *chan, CF_Direction_t di /* * ---------------------------------------------------- - * Generated stub function for CF_FreeTransaction() + * Generated stub function for CF_ForEachChannel() * ---------------------------------------------------- */ -void CF_FreeTransaction(CF_Transaction_t *txn, uint8 chan) +int32 CF_ForEachChannel(CF_Engine_t *engine_ptr, CF_ChannelFunc_t fn, void *arg) { - UT_GenStub_AddParam(CF_FreeTransaction, CF_Transaction_t *, txn); - UT_GenStub_AddParam(CF_FreeTransaction, uint8, chan); + UT_GenStub_SetupReturnBuffer(CF_ForEachChannel, int32); - UT_GenStub_Execute(CF_FreeTransaction, Basic, NULL); + UT_GenStub_AddParam(CF_ForEachChannel, CF_Engine_t *, engine_ptr); + UT_GenStub_AddParam(CF_ForEachChannel, CF_ChannelFunc_t, fn); + UT_GenStub_AddParam(CF_ForEachChannel, void *, arg); + + UT_GenStub_Execute(CF_ForEachChannel, Basic, UT_DefaultHandler_CF_ForEachChannel); + + return UT_GenStub_GetReturnValue(CF_ForEachChannel, int32); } /* * ---------------------------------------------------- - * Generated stub function for CF_GetChannelFromTxn() + * Generated stub function for CF_FreeTransaction() * ---------------------------------------------------- */ -CF_Channel_t *CF_GetChannelFromTxn(CF_Transaction_t *txn) +void CF_FreeTransaction(CF_Transaction_t *txn) { - UT_GenStub_SetupReturnBuffer(CF_GetChannelFromTxn, CF_Channel_t *); - - UT_GenStub_AddParam(CF_GetChannelFromTxn, CF_Transaction_t *, txn); - - UT_GenStub_Execute(CF_GetChannelFromTxn, Basic, NULL); + UT_GenStub_AddParam(CF_FreeTransaction, CF_Transaction_t *, txn); - return UT_GenStub_GetReturnValue(CF_GetChannelFromTxn, CF_Channel_t *); + UT_GenStub_Execute(CF_FreeTransaction, Basic, NULL); } /* diff --git a/unit-test/utilities/cf_test_utils.c b/unit-test/utilities/cf_test_utils.c index 5a13dddb..cef15ec7 100644 --- a/unit-test/utilities/cf_test_utils.c +++ b/unit-test/utilities/cf_test_utils.c @@ -389,7 +389,7 @@ void AnyRandomStringOfLettersOfLengthCopy(char *random_string, size_t length) } /* cf specific */ -uint8 Any_cf_chan_num(void) +CF_ChannelSelect_t Any_cf_chan_num(void) { - return Any_uint8_LessThan(CF_NUM_CHANNELS); + return (Any_uint8_LessThan(CF_NUM_CHANNELS)); } diff --git a/unit-test/utilities/cf_test_utils.h b/unit-test/utilities/cf_test_utils.h index 63f80f11..0960cdd7 100644 --- a/unit-test/utilities/cf_test_utils.h +++ b/unit-test/utilities/cf_test_utils.h @@ -45,7 +45,9 @@ #define RANDOM_VALUES_SEED 0 #endif /* !RANDOM_VALUES_SEED */ -#define UT_CFDP_CHANNEL 0 +#define UT_CFDP_CHANNEL_IDX 0 +#define UT_CFDP_CHANNEL CF_ChannelSelect_FromInt(UT_CFDP_CHANNEL_IDX) +#define UT_CFDP_CHANNEL_PTR CF_GetChannelPtr(UT_CFDP_CHANNEL) typedef enum { @@ -67,9 +69,9 @@ typedef struct { char src_filename[CF_FILENAME_MAX_LEN]; char dst_filename[CF_FILENAME_MAX_LEN]; + CF_Channel_t *chan; CF_CFDP_Class_t cfdp_class; uint8 keep; - uint8 chan; uint8 priority; CF_EntityId_t dest_id; } CF_CFDP_TxFile_context_t; @@ -78,9 +80,9 @@ typedef struct { char src_filename[CF_FILENAME_MAX_LEN]; char dst_filename[CF_FILENAME_MAX_LEN]; + CF_Channel_t *chan; CF_CFDP_Class_t cfdp_class; uint8 keep; - uint8 chan; uint8 priority; CF_EntityId_t dest_id; } CF_CFDP_PlaybackDir_context_t; @@ -252,6 +254,6 @@ int Any_int_Positive(void); char *AnyRandomStringOfLettersOfLength(size_t length); void AnyRandomStringOfLettersOfLengthCopy(char *random_string, size_t length); -uint8 Any_cf_chan_num(void); +CF_ChannelSelect_t Any_cf_chan_num(void); #endif