/**************************************************************************//**
 * @item     CosyOS-II Kernel
 * @file     sv_int_loc.h
 * @brief    中断本地服务（仅在用户中断中调用，并在本地执行）
 * @author   迟凯峰
 * @version  V1.3.3
 * @date     2024.01.31
 ******************************************************************************/

#ifndef __SV_INT_LOC_H
#define __SV_INT_LOC_H

void       si_task_scheduling(void);
void       si_taskpri_scheduling(s_tasknode_tsp node);
s_bool_t   si_take_binary(s_binary_tsp bin);
m_fetion_t si_recv_fetion(s_fetion_tsp fet);
#if SYSCFG_MCUCORE == 8051
s_bool_t   si_can_read_gmbox(void _OBJ_MEM_ *gm);
s_bool_t   si_can_read_lmbox(void);
void      *si_get_lmbox(void);
s_bool_t   si_can_access_msgqueue(s_msgqueue_tsp queue);
#else
s_bool_t   si_recv_mail(void *lm, s_mailbox_tsp gm, size_t size) MCUCFG_251_REENTRANT;
#endif
void      *si_recv_msg (s_msgqueue_tsp queue);



/*
 * 二值信号量
 */

/* 获取 */
#define sISV_TakeBin(bin) \
	si_take_binary(&bin)



/*
 * 飞信（接收飞信）
 */

#define sISV_RecvFetion(tbox) \
	si_recv_fetion(&tbox)



/*
 * 消息邮箱（接收邮件）
 */
#if SYSCFG_MCUCORE == 8051
#if SYSCFG_MAILBOX_ACCESSMECHANISM == 0
#define sISV_RecvMail(mail, mbox) \
( \
	si_can_read_gmbox((s_mailbox_tsp)&mbox) \
	? mbox.gf \
		? s_memcpy(mail, &mbox.mail0, sizeof(mbox.mail0)) || true \
			? mbox.gf-- \
			: mbox.gf-- \
		: false \
	: false \
)

#elif SYSCFG_MAILBOX_ACCESSMECHANISM == 1
#define sISV_RecvMail(mail, mbox) \
( \
	si_can_read_gmbox((s_mailbox_tsp)&mbox) \
	? mbox.gf \
		? s_memcpy(mail, &mbox.mail0, sizeof(mbox.mail0)) || true \
			? mbox.gf-- \
			: mbox.gf-- \
		: false \
	: si_can_read_lmbox() \
		? s_memcpy(mail, si_get_lmbox(), sizeof(mbox.mail0)) || true \
			? true \
			: true \
		: false \
)

#endif
#else
#define sISV_RecvMail(mail, mbox) \
	si_recv_mail(mail, (s_mailbox_tsp)&mbox, sizeof(mbox.mail0))

#endif



/*
 * 消息队列（接收消息）
 */
#if SYSCFG_MCUCORE == 8051
#define	sISV_RecvMsg(que) \
( \
	si_can_access_msgqueue(que) ? si_recv_msg(que) : NULL \
)
#else
#define	sISV_RecvMsg(que) \
	si_recv_msg(que)
#endif



/*
 * 事件标志组
 */

 /* 查询标志组 */
#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 \
)



/*
 * 软件RTC
 */

/* 获取时间 */
#define sISV_GetTime(t) \
	s_memcpy(t, !iWhichGVar_Read ? s_rtc[0] : s_rtc[1], sizeof(s_rtc[0]))



/*
 * 任务调度
 */

/* 无条件任务调度 */
#define sISV_TaskScheduling          si_task_scheduling()

/* 任务优先级调度 */
#define sISV_TaskPriScheduling(node) si_taskpri_scheduling(node)



#endif
