#ifndef __OSPTIMERH__
#define __OSPTIMERH__

#ifdef __cplusplus
extern "C" {
#endif

/* timer pool number define */
#define OSP_TIMER_NUM    (8)


typedef enum {
    TIMER_RUNNING = 1,
    TIMER_SUSPEND,
    TIMER_READY,

}TimerState;




typedef struct NODE{
    uint32_t TimerOff;
    uint32_t NextNodeOff;
}Node;

typedef struct tag_Osp_Timer_Tcb
{
    uint32_t             Repeat;
    uint32_t             DstTaskId;
    uint32_t             Period; 
    int32_t             TimeOut;
    uint32_t             Delay;
    uint64_t             RunCnt;
    uint32_t             State;
    int32_t             Fd;

    uint32_t             MaxTimeOut;
    uint32_t             TimeOutCnt;
    uint32_t             Valid;

}OSP_timer_Tcb;

#define MSG_TO_PTIMER(msg)  ((uint64_t)(msg) + MSG_HEAD_SIZE)



extern OSP_STATUS osp_timer_pool_init(void);
extern void *osp_timer_create_sim(uint32_t DstTaskId, bool isRepeat, uint32_t timeout, uint32_t Delay);
extern void *OSP_timerCreate(uint32_t DstTaskId, uint64_t param1, uint64_t param2, bool isRepeat, uint32_t timeout, OSP_FUNCPTR timerCallback, uint32_t Delay);
extern OSP_STATUS osp_timer_start(void *pTimer);
extern OSP_STATUS OSP_timerDelete(void *pTimer);
extern void osp_timer_del_sim(void *timer);

extern  OSP_STATUS osp_timer_callback(uint64_t ospTaskId, uint64_t timer);
extern void osp_show_timer_count(void);
extern int32_t osp_clk_rate_get(void);
extern uint64_t osp_get_osp_ticks(void);
extern void osp_set_ticks(uint64_t ticks);
extern void showRunTimerInfo(void);
extern void showStopTimerInfo(void);
extern uint64_t OSP_getTimerRemainTime(void *pTimer);
extern uint32_t osp_get_systick();
extern void osp_pridel_time(void);

void osp_show_timer_info(void);
int32_t CreatFreSynFd(uint32_t pri, uint32_t offset);
void  osp_timer_suspend_sim(void *timer);


void  osp_tick_less(void);
uint64_t osp_get_cycel(void);


#ifdef __cplusplus
}
#endif

#endif  /* __OSPTIMERH__ */

