#ifndef _SR_BSP_OSAL_H
#define _SR_BSP_OSAL_H

#include "sr_stddef.h"

//合宙EC7xx
#include "luat_rtos.h"
#include <luat_malloc.h>
#include "luat_mcu.h"


//FreeRTOS
#include "FreeRTOS.h"
#include "task.h" 

//cmsis API
#include "cmsis_os2.h"


/******************事件******************/


typedef enum
{
	BSP_EVENT_AND 		= LUAT_FLAG_AND,
	BSP_EVENT_AND_CLEAR = LUAT_FLAG_AND_CLEAR,
	BSP_EVENT_OR 		= LUAT_FLAG_OR,
	BSP_EVENT_OR_CLEAR	= LUAT_FLAG_OR_CLEAR
} BSP_EVENT_OP_E;



/**
 * @brief 创建事件
 *
 * @param[out] eventHandle 返回的事件句柄
 * @return int =0成功，其他失败
 */
#define BspOsEventCreate(eventHandle) luat_rtos_flag_create(eventHandle)


/**
 * @brief 等待接收事件
 * @param[in] eventHandle 事件句柄
 * @param[in] mask 等待的事件掩码,uint32_t类型
 * @param[in] opt  事件触发要求（与操作需要全部满足才触发，或操作有一个就触发）和操作（是否要清除）
 * @param[out] events 当前事件状态值,uint32_t *类型
 * @param[in]  timeout 超时时间，uint32_t类型
 * @return int =0成功，其他失败
 */
#define BspOsEventRecv(eventHandle,mask,opt,events,timeout) luat_rtos_flag_wait(eventHandle, mask, opt, events, timeout)

/**
 * @brief 发送事件
 * @param[in] eventHandle 事件句柄
 * @param[in] mask 设置掩码
 * @return int =0成功，其他失败
 */
#define BspOsEventSend(eventHandle,mask) luat_rtos_flag_release(eventHandle, uint32_t mask, 0)

/**
 * @brief 删除事件
 *
 * @param[in] eventHandle 事件句柄
 * @return int =0成功，其他失败
 */
#define BspOsEventDelete(eventHandle)    luat_rtos_flag_delete(eventHandle)

#define BspOsDelay(tick)          luat_rtos_task_sleep(tick)


SR_MUTX_T BspOsMutexCreate(void);
int BspOsMutexDelete(SR_MUTX_T mutexHdl);
int BspOsMutexTake(SR_MUTX_T mutexHdl,uint32_t timeout);
int BspOsMutexRelease(SR_MUTX_T mutexHdl);


void BspOsEnterCritical(void);
void BspOsExitCritical(void);
srTick_t BspOsGetTick(void);

void *BspOsMalloc(srSize_t size);
void BspOsFree(void *rmem);
void* BspOsRealloc(void* ptr, srSize_t size);
void* BspOsCalloc(srSize_t count, srSize_t size);

void BspPrintDmemInfo(void);


#define BspGetTickUs()      luat_mcu_tick64()



#endif

