219 lines
6.6 KiB
C
219 lines
6.6 KiB
C
/*
|
|
* Copyright (c) 2015, Freescale Semiconductor, Inc.
|
|
* Copyright 2016-2018 NXP
|
|
* All rights reserved.
|
|
*
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#ifndef __MESSAGING_H__
|
|
#define __MESSAGING_H__
|
|
|
|
#ifndef SDK_COMPONENT_DEPENDENCY_FSL_COMMON
|
|
#define SDK_COMPONENT_DEPENDENCY_FSL_COMMON (1U)
|
|
#endif
|
|
#if (defined(SDK_COMPONENT_DEPENDENCY_FSL_COMMON) && (SDK_COMPONENT_DEPENDENCY_FSL_COMMON > 0U))
|
|
#include "fsl_common.h"
|
|
#else
|
|
#endif
|
|
#include "fsl_component_generic_list.h"
|
|
|
|
/*! @brief Definition to determine whether use message macro define. */
|
|
#ifndef MSG_USE_MACRO
|
|
#define MSG_USE_MACRO (1)
|
|
#endif
|
|
|
|
#if (defined(MSG_USE_MACRO) && (MSG_USE_MACRO == 1U))
|
|
#define MSG_QueueInit(anchor) LIST_Init(anchor, 0)
|
|
#define MSG_QueueDeinit(anchor) \
|
|
while (MSG_QueueGetHead(anchor)) \
|
|
{ \
|
|
(void)MEM_BufferFree(LIST_RemoveHead(anchor)); \
|
|
}
|
|
#endif
|
|
/*!
|
|
* @addtogroup Messaging
|
|
* @{
|
|
*/
|
|
|
|
/*******************************************************************************
|
|
* Definitions
|
|
******************************************************************************/
|
|
|
|
/*! @brief The msg status */
|
|
#if (defined(SDK_COMPONENT_DEPENDENCY_FSL_COMMON) && (SDK_COMPONENT_DEPENDENCY_FSL_COMMON > 0U))
|
|
typedef enum _messaging_status
|
|
{
|
|
kMSG_Success = kStatus_Success, /*!< Success */
|
|
kMSG_Error = MAKE_STATUS(kStatusGroup_MSG, 1), /*!< Error */
|
|
} messaging_status_t;
|
|
#else
|
|
typedef enum _messaging_status
|
|
{
|
|
kMSG_Success = 0, /*!< Success */
|
|
kMSG_Error = 1, /*!< Error */
|
|
} messaging_status_t;
|
|
|
|
#endif
|
|
|
|
typedef list_label_t messaging_t;
|
|
|
|
/*******************************************************************************
|
|
* API
|
|
******************************************************************************/
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C" {
|
|
#endif /* _cplusplus */
|
|
|
|
#if (defined(MSG_USE_MACRO) && (MSG_USE_MACRO == 0U))
|
|
/*!
|
|
* @brief Initializes the message queue.
|
|
*
|
|
* This function initializes the message queue.
|
|
*
|
|
* @param msgQueue The message queue pointer.
|
|
* @retval kMSG_Success Initialization is successful.
|
|
*/
|
|
void MSG_QueueInit(messaging_t *msgQueue);
|
|
|
|
/*!
|
|
* @brief De-initializes the message queue.
|
|
*
|
|
* This function de-initializes the message queue.
|
|
*
|
|
* @param msgQueue The message queue pointer.
|
|
*/
|
|
void MSG_QueueDeinit(messaging_t *msgQueue);
|
|
#endif
|
|
/*!
|
|
* @brief Allocates a message node with the length.
|
|
*
|
|
* This function allocates a message node with the length.
|
|
*
|
|
* @param length The length of the message.
|
|
* @retval The allocated memory buffer address.
|
|
*/
|
|
void *MSG_Alloc(uint32_t length);
|
|
|
|
/*!
|
|
* @brief frees a buffer allocated by #MSG_Alloc.
|
|
*
|
|
* This function frees a buffer allocated by #MSG_Alloc.
|
|
*
|
|
* @param buffer The buffer address.
|
|
*/
|
|
void MSG_Free(void *buffer);
|
|
|
|
/*!
|
|
* @brief Links a message to the tail of the message queue.
|
|
*
|
|
* The function links a message to the tail of the message queue.
|
|
* The memory space of the message must be allocated by calling the function
|
|
* #MSG_Alloc. And the memory space of the message must be freed by calling
|
|
* the function #MSG_Free.
|
|
*
|
|
* @param msgQueue The message queue pointer.
|
|
* @param msg The pointer of the message allocated by the #MSG_Alloc.
|
|
* @retval kMSG_Success The message is added.
|
|
* @retval kMSG_Error The message addition failed.
|
|
*/
|
|
messaging_status_t MSG_QueueAddTail(messaging_t *msgQueue, void *msg);
|
|
|
|
/*!
|
|
* @brief Links a message to the head of the message queue.
|
|
*
|
|
* The function links a message to the head of the message queue.
|
|
* The memory space of the message must be allocated by calling the function
|
|
* #MSG_Alloc. And the memory space of the message must be freed by calling
|
|
* the function #MSG_Free.
|
|
*
|
|
* @param msgQueue The message queue pointer.
|
|
* @param msg The pointer of the message allocated by the #MSG_Alloc.
|
|
* @retval kMSG_Success The message is added.
|
|
* @retval kMSG_Error The message addition failed.
|
|
*/
|
|
messaging_status_t MSG_QueueAddHead(messaging_t *msgQueue, void *msg);
|
|
|
|
/*!
|
|
* @brief Links a message to the previous of the given message.
|
|
*
|
|
* The function links a message to the previous of the given message.
|
|
* The memory space of the message must be allocated by calling the function
|
|
* #MSG_Alloc. And the memory space of the message must be freed by calling
|
|
* the function #MSG_Free.
|
|
*
|
|
* @param msg The given message pointer.
|
|
* @param newMsg A new message pointer needs to be added.
|
|
* @retval kMSG_Success The message is added.
|
|
* @retval kMSG_Error The message addition failed.
|
|
*/
|
|
messaging_status_t MSG_QueueAddPrev(void *msg, void *newMsg);
|
|
|
|
/*!
|
|
* @brief Unlinks a message from its message queue.
|
|
*
|
|
* The function unlinks a message from its message queue.
|
|
* The memory space of the message must be allocated by calling the function
|
|
* #MSG_Alloc. And the memory space of the message must be freed by calling
|
|
* the function #MSG_Free.
|
|
*
|
|
* @param msg The message pointer.
|
|
* @retval kMSG_Success The message is removed.
|
|
* @retval kMSG_Error The message removal failed.
|
|
*/
|
|
messaging_status_t MSG_QueueRemove(void *msg);
|
|
|
|
/*!
|
|
* @brief Unlinks the head from the message queue.
|
|
*
|
|
* The function unlinks the head from the message queue.
|
|
*
|
|
* @param msgQueue The message queue pointer.
|
|
* @retval NULL if the message queue is empty, or the pointer of removed message if removal was successful.
|
|
*/
|
|
void *MSG_QueueRemoveHead(messaging_t *msgQueue);
|
|
|
|
/*!
|
|
* @brief Gets the head of the message queue.
|
|
*
|
|
* The function gets the head of the message queue.
|
|
*
|
|
* @param msgQueue The message queue pointer.
|
|
* @retval The pointer of the message if the head is not NULL, or NULL.
|
|
*/
|
|
void *MSG_QueueGetHead(messaging_t *msgQueue);
|
|
|
|
/*!
|
|
* @brief Gets the next node of a given message.
|
|
*
|
|
* The function gets the next node of a given message.
|
|
* The memory space of the message must be allocated by calling the function
|
|
* #MSG_Alloc. And the memory space of the message must be freed by calling
|
|
* the function #MSG_Free.
|
|
*
|
|
* @param msg The message pointer.
|
|
* @retval The pointer of the message if the next pointer is not NULL, or NULL.
|
|
*/
|
|
void *MSG_QueueGetNext(void *msg);
|
|
|
|
/*!
|
|
* @brief Gets the previous node of a given message.
|
|
*
|
|
* The function gets the previous node of a given message.
|
|
* The memory space of the message must be allocated by calling the function
|
|
* #MSG_Alloc. And the memory space of the message must be freed by calling
|
|
* the function #MSG_Free.
|
|
*
|
|
* @param msg The message pointer.
|
|
* @retval The pointer of the message if the previous pointer is not NULL, or NULL.
|
|
*/
|
|
void *MSG_QueueGetPrev(void *msg);
|
|
|
|
#if defined(__cplusplus)
|
|
}
|
|
#endif
|
|
/*! @}*/
|
|
#endif /* __MESSAGING_H__ */
|