#ifndef __RGB_CIRCLE_MGR_H__
#define __RGB_CIRCLE_MGR_H__

#include "rtthread.h"
#include "stdbool.h"
#include "rgb_player.h"
#include "drv_flash.h"
#include "mem_section.h"

#define RGB_CIRCLE_MGR_THREAD_NAME          ("rgb_circle_mgr")  /**< 线程名称 */
#define RGB_CIRCLE_MGR_THREAD_STACK_SIZE    (2 * 1024)          /**< 线程栈大小 */
#define RGB_CIRCLE_MGR_THREAD_PRIORITY      (22)                /**< 线程优先级 */
#define RGB_CIRCLE_MGR_THREAD_TIMESLICE     (10)                /**< 线程时间片 */
#define RGB_CIRCLE_MGR_SEM_NAME             ("rgb_circle_sem")  /**< 信号量名称 */
#define RGB_CIRCLE_MGR_MQ_NAME              ("rgb_circle_mq")   /**< 消息队列名称 */
#define RGB_CIRCLE_MGR_MQ_DEPTH             (8)                 /**< 消息队列深度 */

#define RGB_CIRCLE_MGR_MAX_EFFECTS_NUM      (20)                /**< 最大特效数量 */

#define RGB_CIRCLE_MGR_RGB_NUM              (RGB_CIRCLE_RGB_NUM)/**< RGB灯珠数量 */
#define RGB_CIRCLE_MGR_CACHE_SIZE           (RGB_CIRCLE_RGB_NUM)/**< 缓存大小，每个LED占用4字节 */


#if defined(__CC_ARM) || defined(__CLANG_ARM)
L2_RET_BSS_SECT_BEGIN(g_rgb_circle_mgr_thread_stack)
    static uint32_t g_rgb_circle_mgr_thread_stack[RGB_CIRCLE_MGR_THREAD_STACK_SIZE / sizeof(uint32_t)];
L2_RET_BSS_SECT_END
#else
    static uint32_t g_rgb_circle_mgr_thread_stack[RGB_CIRCLE_MGR_THREAD_STACK_SIZE / sizeof(uint32_t)] L2_RET_BSS_SECT(g_rgb_circle_mgr_thread_stack);
#endif

/**
 * @brief RGB灯环的灯效管理器结构体
 * 
 * @details 该结构体包含了RGB灯环的玩家、特效数组、特效数量、缓存数组和消息队列池。
 */
struct rgb_circle_mgr_t
{
    rgb_player_t player;
    rgb_effect_t effects[RGB_CIRCLE_MGR_MAX_EFFECTS_NUM];
    uint16_t effect_count;
    uint32_t frame_cache[RGB_CIRCLE_MGR_CACHE_SIZE];
    uint8_t mq_pool[RGB_CIRCLE_MGR_MQ_DEPTH * sizeof(rgb_player_msg_t)];
};


/**
 * @brief 初始化RGB灯环的灯效管理器
 * 
 * @return rt_err_t 初始化结果
 */ 
rt_err_t rgb_circle_mgr_init(void);

/**
 * @brief 关闭RGB灯环的灯效管理器
 * 
 * @return rt_err_t 关闭结果
 */ 
rt_err_t rgb_circle_mgr_deinit(void);

/**
 * @brief 从RGB灯效列表中获取参数
 * 
 * @return rt_err_t 获取结果
 */ 
static rt_err_t rgb_circle_mgr_get_effects(void);

/**
 * @brief 输出RGB灯环的灯效颜色
 * 
 * @param buff 颜色缓存
 * @param count 颜色数量
 * @return rt_err_t 输出结果    
 */
static rt_err_t rgb_circle_mgr_output_effect(uint32_t *buff, uint32_t count);


/**
 * @brief 启动RGB灯环的灯效播放开始
 * 
 * @return rt_err_t 启动结果
 */
rt_err_t rgb_circle_mgr_play_start(void);

/**
 * @brief 停止RGB灯环的灯效播放停止
 * 
 * @return rt_err_t 停止结果
 */
rt_err_t rgb_circle_mgr_play_stop(void);

/**
 * @brief 切换到RGB灯环的下一个灯效播放
 * 
 * @return rt_err_t 切换结果
 */ 
rt_err_t rgb_circle_mgr_play_next(void);

/**
 * @brief 切换到RGB灯环的上一个灯效播放
 * 
 * @return rt_err_t 切换结果
 */ 
rt_err_t rgb_circle_mgr_play_prev(void);



#endif  /* __RGB_CIRCLE_MGR_H__ */


