/**
 * @file    mySystem.h
 * @brief   系统管理模块公共定义 — X-Macro 框架
 * @details 通过 app_modules.h X-Macro 自动生成:
 *           1) enum_app 枚举（所有模块 ID）
 *           2) extern 函数声明（init1/init2/thread）
 *           3) g_vec_app 初始化列表（app_sys.cpp 中使用）
 *          新增模块只需修改 app_modules.h，无需改框架代码。
 */
#ifndef _MY_SYSTEM_H_
#define _MY_SYSTEM_H_

#include "myBase.h"
#include "myTask.h"

#ifdef __cplusplus
extern "C"
{
#endif

/** 每个模块的定时器数量（10ms / 100ms / 1000ms 三级） */
#define TIMER_NUM 3

#define EV_TIMER1  (0x01 << 0)
#define EV_TIMER2  (0x01 << 1)
#define EV_TIMER3  (0x01 << 2)
#define EV_STOP    (0x80)          /**< 模块停止信号 */

/* 跨模块事件 */
#define EV_COM_RX_SELF_PTL  (0x01 << 3)  /**< com_router: self_ptl 投递数据 */
#define EV_SELF_PTL_RX_COM  (0x01 << 4)  /**< self_ptl: com_router 投递数据 */
#define EV_IEC_RX_COM       (0x01 << 5)  /**< iec: com_router 投递 IEC-104 帧 */
#define EV_COM_RX_IEC       (0x01 << 6)  /**< com_router: iec 投递回复帧 */

#define MSG_SIZE 2048

/* ---- 消息结构 (MQ 传输封装) ---- */
#pragma pack(1)
typedef struct
{
	uint32_t interface;
	uint16_t len;
	uint8_t  backup[2];
	uint8_t  data[0];
} stru_msg_head;
#pragma pack()

/* ---- 应用枚举，由 app_modules.h 生成 ---- */
#define APP_MODULE(name, cfg_name, init1, init2, func) ENUM_APP_##name,
typedef enum
{
#include "app_modules.h"
    ENUM_APP_MAX
} enum_app;
#undef APP_MODULE

/* ---- 消息队列枚举，由 app_msg_queue.h 生成 ---- */
#define APP_MQ(name, cfg_name, msg_size, msg_num) ENUM_MQ_##name,
typedef enum
{
#include "app_msg_queue.h"
    ENUM_MQ_MAX
} enun_msg_queue;
#undef APP_MQ

/* ---- 应用数据收发结构体 ---- */
typedef struct
{
    uint16_t rx_len;
    uint16_t tx_len;
    uint8_t  rx[MSG_SIZE];
    uint8_t  tx[MSG_SIZE];
} stru_rtx_data;

/* ---- 应用上下文（每个线程模块一个实例） ---- */
typedef int   (*app_init_fn)(void *arg);
typedef void *(*app_func_fn)(void *arg);

typedef struct
{
    const char         *name;
    uint32_t            app_id;
    app_init_fn         app_init1;
    app_init_fn         app_init2;
    app_func_fn         fun_cb;
    void               *arg;
    stru_task_event_t   p_event;
    stru_rtx_data       rtx;
    uint32_t            timer_arg[TIMER_NUM];
    stru_task_timer_t   p_timer[TIMER_NUM];
    uint32_t            run_cnt;
} stru_app;

/* ---- 获取模块指针 ---- */
stru_app *app_get_ptr(uint32_t app_id);

/* ---- 消息队列结构 ---- */
typedef struct
{
	const char             *name;
	uint32_t                msg_size;
	uint32_t                msg_num;
	stru_task_msg_queue_t   p_msg_queue;
} stru_app_msg_queue;

/* ---- MQ 目标映射 ---- */
typedef struct
{
	uint32_t app_id;
	uint32_t event;
} stru_mq_target;

/* ---- MQ 查询 ---- */
extern stru_app_msg_queue g_app_mq[ENUM_MQ_MAX];
stru_app_msg_queue *app_get_msg_queue_ptr(uint32_t mq_id);
stru_mq_target      app_get_mq_target(uint32_t mq_id);

/* ---- extern 函数声明，由 app_modules.h 生成 ---- */
#define APP_MODULE(name, cfg_name, init1, init2, func) \
    extern int   init1(void *arg); \
    extern int   init2(void *arg); \
    extern void *func(void *arg);

#include "app_modules.h"
#undef APP_MODULE

/* ---- 初始化与停止 ---- */
int  app_sys_init(void);
void app_sys_stop(void);

#ifdef __cplusplus
}
#endif

#endif /* _MY_SYSTEM_H_ */
