/**************************************************************************//**
 * @item     CosyOS-III Kernel
 * @file     sv_int_loc.h
 * @brief    中断本地服务
 * @details  在用户中断中调用并直接在本地执行。
 * @author   迟凯峰
 * @version  v3.0.0
 * @date     2026.07.21
 ******************************************************************************/

#ifndef __SV_INT_LOC_H
#define __SV_INT_LOC_H

#include "os_redef.h"
bool       si_take_binary (s_binary_tsp hbin);
bool       si_take_quemut (s_msgque_tsp hque);
void      *si_recv_msg_c51(s_msgque_tsp hque);
void      *si_recv_msg_n51(s_msgque_tsp hque);
void      *si_recv_mail   (s_mailbox_tsp hmbox);
m_fetion_t si_recv_fetion (s_tionbox_tsp htbox);

/**
 @addtogroup CosyOS_内核服务
 @{
 *//**
 \defgroup   中断本地服务
 \brief      在用户中断中调用并直接在本地执行的服务。
 @{
 */

#define sISV_TakeBin(bin)     si_take_binary(&bin)  /*!< 获取二值信号量 */
#define sISV_RecvFetion(tbox) si_recv_fetion(&tbox) /*!< 接收飞信 */
#define sISV_RecvMail(mbox)   si_recv_mail(&mbox)   /*!< 接收邮件 */

#if defined ( __C51__ )
#define sISV_RecvMsg(que) (si_take_quemut((s_msgque_tsp)&que) ? si_recv_msg_c51((s_msgque_tsp)&que) : OS_NULL) /*!< C51接收消息 */
#else
#define sISV_RecvMsg(que)  si_recv_msg_n51((s_msgque_tsp)&que) /*!< 非51接收消息 */
#endif

/** 归还二值信号量 */
#define sISV_BackBin(bin) \
do{ \
	__mx_MMB(); \
	bin.binary = true; \
}while(false)

/** 查询标志组 */
#define sISV_QueryFlagGroup(group) \
( \
	  sizeof(group) == 1 ? *(s_u8_t  *)&group ? true : false \
	: sizeof(group) == 2 ? *(s_u16_t *)&group ? true : false \
	: sizeof(group) == 4 ? *(s_u32_t *)&group ? true : false \
	: false \
)

/** @} */
/** @} */

#endif
