#ifndef __OSAL_DEF_H__
#define __OSAL_DEF_H__

#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Error codes */
typedef int osal_err_t;

#define OSAL_OK          0       /* Operation successful */
#define OSAL_ERROR       (-1)    /* Operation failed */
#define OSAL_ETIMEOUT    (-2)    /* Timeout */
#define OSAL_EFULL       (-3)    /* Resource full */
#define OSAL_EEMPTY      (-4)    /* Resource empty */
#define OSAL_ENOMEM      (-5)    /* No memory */
#define OSAL_ENOSYS      (-6)    /* No system */
#define OSAL_EBUSY       (-7)    /* Busy */
#define OSAL_EIO         (-8)    /* IO error */
#define OSAL_EINTR       (-9)    /* Interrupted */
#define OSAL_INVAL       (-10)   /* Invalid argument */

/* Backward compatibility */
#define OSAL_TIMEOUT     OSAL_ETIMEOUT
#define OSAL_NO_MEMORY   OSAL_ENOMEM

/* Wait Forever */
#define OSAL_WAIT_FOREVER ((osal_tick_t)-1)

/* Assert */
#ifndef OSAL_ASSERT
#ifdef OSAL_DEBUG
#define OSAL_ASSERT(EX)                                                         \
if (!(EX))                                                                      \
{                                                                               \
    extern void osal_kprintf(const char *fmt, ...);                             \
    osal_kprintf("(%s) has assert failed at %s:%d.\n", #EX, __FUNCTION__, __LINE__); \
    while (1);                                                                  \
}
#else
#define OSAL_ASSERT(EX)
#endif
#endif

/* Priority */
typedef unsigned char osal_priority_t;

#define OSAL_PRIORITY_LOWEST    255     /* Lowest priority */
#define OSAL_PRIORITY_HIGHEST   0       /* Highest priority */

/* Basic Types */
typedef unsigned int osal_tick_t;
typedef unsigned int osal_size_t;
typedef int osal_int32_t;
typedef unsigned int osal_uint32_t;
typedef unsigned char osal_uint8_t;
typedef unsigned short osal_uint16_t;
typedef void* osal_handle_t;

/* IPC Flags */
#define OSAL_FLAG_FIFO          0x00    /* FIFO scheduling */
#define OSAL_FLAG_PRIO          0x01    /* Priority scheduling */

/* Event Flags */
#define OSAL_EVENT_AND          0x01    /* Logic AND */
#define OSAL_EVENT_OR           0x02    /* Logic OR */
#define OSAL_EVENT_CLEAR        0x04    /* Clear event */

/* Timer Flags */
#define OSAL_TIMER_FLAG_ONE_SHOT     0x00    /* One shot */
#define OSAL_TIMER_FLAG_PERIODIC     0x01    /* Periodic */

#ifdef __cplusplus
}
#endif

#endif /* __OSAL_DEF_H__ */
