#ifndef _SR_OSAL_H
#define _SR_OSAL_H

#include "sr_config.h"
#include "sr_stddef.h"

#ifdef SR_USE_OS
#define SR_THD_RET  void

#else
#include "sr_ct.h"
#define SR_THD_RET  int
#endif


#define OS_WAIT_FOREVER   SR_TICK_MAX
#define OS_NO_WAIT        0U
#define OS_SEM_MAX_VALUE  SR_UINT32_MAX



#include "sr_bsp_osal.h"

#ifdef SR_USE_OS
//即将弃用


/**
 * @brief 定义互斥量句柄
 */
typedef void * SR_MUTX_T;

/**
 * @brief 定义事件句柄
 */
typedef void * SR_EVENT_T;


/***********************互斥量**********************************/
/**
 * @brief 创建互斥量
 *
 * @return 成功返回SR_MUTX_T类型句柄，失败返回SR_NULL;
 */
#define SR_OsMutexCreate()   BspOsMutexCreate()

/**
 * @brief 删除互斥量
 *
 * @param[in] mutexHdl 互斥量句柄
 *
 * @return int =0成功，其他失败
 */
#define SR_OsMutexDelete(mutexHdl)     BspOsMutexDelete(mutexHdl)

/**
 * @brief 互斥量获取
 *
 * @param[in] mutexHdl 互斥量句柄
 * @param[in] timeout  超时时间
 *
 * @return int =0成功，其他失败
 */
#define SR_OsMutexTake(mutexHdl,timeout)     BspOsMutexTake(mutexHdl,timeout)

/**
 * @brief 互斥量释放
 *
 * @param[in] mutexHdl 互斥量句柄
 *
 * @return int =0成功，其他失败
 */
#define SR_OsMutexRelease(mutexHdl)     BspOsMutexRelease(mutexHdl)


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

/**
 * @brief 定义事件OPT类型
 */
typedef enum
{
	SR_EVT_AND 		= BSP_EVENT_AND,
	SR_EVT_AND_CLEAR = BSP_EVENT_AND_CLEAR,
	SR_EVT_OR 		= BSP_EVENT_OR,
	SR_EVT_OR_CLEAR	= BSP_EVENT_OR_CLEAR
} SR_EVT_OP_E;

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



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

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

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


#endif


/*****************os clock*******************/

#ifndef SR_TICK_RATE_HZ
#define SR_TICK_RATE_HZ   ((srTick_t)1000)   /*!< OS时基频率：1秒钟TICK中断产生的次数*/
#endif

//示例：SR_OsDelay(500/SR_TICK_PERIOD_MS);  //表示延时500ms
//#define SR_TICK_PERIOD_MS    ( ( srTick_t ) 1000 / SR_TICK_RATE_HZ )   /*!<每个tick是多少ms(理解：(1000ms里有SR_TICK_RATE_HZ个tick))*/

/*!< 将ms转换为OS tick，无向上取整*/
#define SR_MS_TO_TICKS(timeMs)  ((srTick_t)(((srTick_t)(timeMs)*(srTick_t)SR_TICK_RATE_HZ )/(srTick_t)1000))

/*!< 将tick转换为ms*/
#define SR_TICKS_TO_MS(ticks)   ((srTick_t)(((srTick_t)(ticks)*(srTick_t)1000)/(srTick_t)SR_TICK_RATE_HZ))


/**
 * @brief   将ms转换为OS tick，向上取整
 *
 * @param[in] ms 毫秒数
 *
 * @return  转换后的的tick值
 */
srTick_t SR_OsMsToTick(uint32_t ms);


/**
 * @brief  系统延时函数(阻塞)
 *
 * @param[in]  tick 要延时的tick数
 *
 * @return 无
 */
#define SR_OsDelay(tick)    BspOsDelay(tick)

/**
 * @brief  延时函数(非阻塞,纯延时)
 *
 * @param[in]  tick 要延时的tick数
 *
 * @return 无
 */
#define SR_Delay(tick)    BspDelay(tick)

/**
 * @brief  获取当前系统时基的tick值，毫秒级
 *
 * @return 当前tick值,uint32_t类型
 */
#define SR_OsGetTick()      BspOsGetTick()


/*****获取微秒级tick********/
#ifndef SR_TICK_RATE_US
#define SR_TICK_RATE_US   ((srTick_t)26)   /*!< 1微秒=多少tick*/
#endif

/*!< 获取当前tick,微秒级*/
#define SR_GetTickUs(void)  BspGetTickUs()

/*!< 将tick转换为us,前提是SR_GetTickUs获取的tick*/
#define SR_TICK_TO_US(ticks)   ((float)((float)(ticks)/(float)SR_TICK_RATE_US))

/**
 * @brief  获取指定函数的执行耗时
 *
 * @param[in]  func     指定函数
 * @param[out] startTc  起始tick，uint32_t类型
 * @param[out] endTc    结束tick，uint32_t类型 
 * @param[out] totalTm  总耗时，uint32_t类型，单位us，(endTc-startTc)对应的时间
 */
#define SR_GET_EXCT_TIME(func,startTc,endTc,totalTm) \
        do  \
		{	\
            startTc = SR_GetTickUs();   \
            func;                       \
            endTc= SR_GetTickUs();      \
            totalTm = SR_TICK_TO_US(endTc-startTc);   \
        }while(0)

#if   0
//性能测试使用，嵌在BSP内部，记录开始调用原厂API的tick
extern uint32_t g_callTick;
#define _RECORD_CALL_TICK()   g_callTick=SR_GetTickUs()
#define _CLEAR_CALL_TICK()    g_callTick=0
#define _GET_CALL_TICK        g_callTick
#endif








/*************临界段保护*****************/
#define SR_DisableIrq() BspDisableIrq()      //关中断
#define SR_EnableIrq()  BspEnableIrq()       //开中断

#define SR_OsEnterCritical()    BspOsEnterCritical()
#define SR_OsExitCritical()     BspOsExitCritical()


/*************内存管理*****************/
#define SR_OsMalloc(size)       BspOsMalloc(size)
#define SR_OsFree(ptr)          BspOsFree(ptr)
#define SR_OsRealloc(ptr,size)  BspOsRealloc(ptr,size)
#define SR_OsCalloc(count,size) BspOsCalloc(count,size)


//打印动态内存信息
#define SR_PrintDmemInfo()      BspPrintDmemInfo()



#endif


