/*
 * event_queue.h
 *
 *  Created on: 2026-03-04
 *      Author: RT-Thread
 *
 *  功能: 事件队列模块头文件
 *  依赖: RT-Thread Nano, osal
 *  跨平台适配: 基于RT-Thread Nano，使用标准API
 */

#ifndef EVENT_QUEUE_H
#define EVENT_QUEUE_H

#include <rtthread.h>
#include "osal.h"

/* 事件类型定义 */
typedef enum {
    EVENT_TYPE_NONE = 0,
    EVENT_TYPE_SENSOR_DATA,
    EVENT_TYPE_NETWORK_CONNECTED,
    EVENT_TYPE_NETWORK_DISCONNECTED,
    EVENT_TYPE_TCP_CLIENT_CONNECTED,
    EVENT_TYPE_TCP_CLIENT_DISCONNECTED,
    EVENT_TYPE_TCP_DATA_RECEIVED,
    EVENT_TYPE_TIMER,
    EVENT_TYPE_ERROR,
    EVENT_TYPE_MAX
} event_type_t;

/* 事件优先级定义 */
typedef enum {
    EVENT_PRIORITY_LOW = 0,
    EVENT_PRIORITY_NORMAL,
    EVENT_PRIORITY_HIGH,
    EVENT_PRIORITY_CRITICAL
} event_priority_t;

/* 事件结构体 */
typedef struct {
    event_type_t type;           /* 事件类型 */
    event_priority_t priority;   /* 事件优先级 */
    void *data;                 /* 事件数据 */
    size_t data_size;           /* 事件数据大小 */
    rt_tick_t timestamp;        /* 事件时间戳 */
} event_t;

/* 事件队列大小 */
#define EVENT_QUEUE_SIZE 64

/* 事件队列结构体 */
typedef struct {
    event_t events[EVENT_QUEUE_SIZE]; /* 事件数组 */
    int head;                          /* 队头索引 */
    int tail;                          /* 队尾索引 */
    int count;                         /* 事件数量 */
    osal_mutex_t mutex;                /* 互斥锁 */
    osal_sem_t sem;                    /* 信号量 */
} event_queue_t;

/**
 * @brief 初始化事件队列
 * @return 0 成功，非0 失败
 */
int event_queue_init(void);

/**
 * @brief 销毁事件队列
 * @return 0 成功，非0 失败
 */
int event_queue_deinit(void);

/**
 * @brief 向事件队列中添加事件
 * @param event 事件指针
 * @return 0 成功，非0 失败
 */
int event_queue_push(event_t *event);

/**
 * @brief 从事件队列中获取事件
 * @param event 事件指针，用于存储获取的事件
 * @param timeout 超时时间，单位ms
 * @return 0 成功，非0 失败
 */
int event_queue_pop(event_t *event, int timeout);

/**
 * @brief 获取事件队列中的事件数量
 * @return 事件数量
 */
int event_queue_get_count(void);

/**
 * @brief 清空事件队列
 * @return 0 成功，非0 失败
 */
int event_queue_clear(void);

#endif /* EVENT_QUEUE_H */
