#ifndef HAS_TASK_MSG_H
#define HAS_TASK_MSG_H


/* 静态订阅表 */
// TODO：后续可支持动态增加模块订阅，感觉目前没必要

typedef enum {
    INVALID_ID = 0,
    GUI,
    SENSOR,
    ACM,
    WIFI,
    VOICE,
    MODULE_MAX
} has_module_ID_e;

#define CHECK_SUBSCIBE_INFO // 如果打开，代码初始化时会检查订阅表是否写错，开发时应该打开
/* 格式：模块 订阅数量 订阅模块 */
#define SUBSCIBE_INFO \
{ \
    {GUI, 4, {ACM, SENSOR, WIFI, VOICE}}, \
    {SENSOR, 2, {GUI, WIFI}}, \
    {WIFI, 0}, \
}

/* 
#define SUBSCIBE_INFO \
{ \
    {GUI, 4, {ACM, WIFI, VOICE, SENSOR}}, \
    {SENSOR, 5, {ACM, GUI, WIFI, VOICE, SENSOR}}, \
    {ACM, 4, {GUI, WIFI, VOICE, SENSOR}}, \
    {WIFI, 4, {ACM, GUI, VOICE, SENSOR}}, \
    {VOICE, 4, {ACM, WIFI, GUI, SENSOR}}, \
}
*/

/**
 * @brief 消息处理回调类型
 * @param module_id:发布者的id号
 * @param buf:消息数据指针
 * @param len:消息数据长度
 * @return 0:成功 -1：失败
 */
typedef int (*has_msg_handle_cb)(unsigned char module_id, const unsigned char *buf, unsigned int len);

/* 基础功能 */
int has_msg_init(void);
int has_msg_os_init(void);

int has_msg_init_module(has_module_ID_e module_id); // HAS OS调用
int has_msg_publish(has_module_ID_e module_id, void *buffer, unsigned int length);
int has_msg_handle(has_module_ID_e module_id, has_msg_handle_cb cb, int ms_timeout);

unsigned int has_msg_is_message_empty(has_module_ID_e module_id);
unsigned int has_msg_get_message_number(has_module_ID_e module_id);
int has_msg_delete_all_message(has_module_ID_e module_id);

/* 扩展功能 */
int has_msg_handle_by_module(has_module_ID_e module_id, has_msg_handle_cb cb, has_module_ID_e pub_module_id);
int has_msg_handle_latest(has_module_ID_e module_id, has_msg_handle_cb cb, int ms_timeout);
unsigned int has_msg_receive(has_module_ID_e module_id, unsigned char *pub_module_id, unsigned char *buf_out, int ms_timeout);
unsigned int has_msg_receive_latest(has_module_ID_e module_id, unsigned char *pub_module_id, unsigned char *buf_out, int ms_timeout);
int has_msg_printf_subscribe(has_module_ID_e module_id);
// int has_msg_subscribe(has_module_ID_e module_id, has_module_ID_e sub_id);
// int has_msg_unsubscribe(has_module_ID_e module_id, has_module_ID_e sub_id);

#endif