/**
 * @file    main.c
 * @brief   RTU 主程序入口
 * @details app_sys_init() 自动启动所有 X-Macro 注册的模块。
 *          新增模块只需修改 src/system/inc/app_modules.h，无需改动本文件。
 *
 *          配置文件约定:
 *            WORK_PATH/           (可执行文件所在目录，或 WORK_PATH 环境变量指定)
 *            ├── RTU
 *            └── config/
 *                └── SYSTEM/
 *                    └── app_config.json
 */
#include "mySystem.h"
#include "myLog.h"
#include "myDatacenter.h"
#include "myFunc.h"

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

static volatile int g_running = 1;

static void sig_handler(int sig)
{
    g_running = 0;
    LOG_I("signal %d received, shutting down...", sig);
}

int main(int argc, char *argv[])
{
    (void)argc;
    (void)argv;

    printf("\n=== RTU_ALL_AI Starting ===\n\n");

    signal(SIGINT,  sig_handler);
    signal(SIGTERM, sig_handler);
    signal(SIGPIPE, SIG_IGN);

    /* 日志初始化：控制台输出（调试可见），运行时可开文件输出 */
    log_init(NULL);

    /* 启动数据中心 */
    dc_init(NULL);

    /* X-Macro 驱动启动所有模块 */
    if (app_sys_init() != 0)
    {
        LOG_E("app_sys_init failed, aborting");

        return 1;
    }

    LOG_I("RTU running");

    /* 导出 out 信号 XML 供前端 PLC Config 页面使用（所有模块 init1/init2 之后） */
    {
        char proc_dir[256] = {0};

        if (0 == func_proc_self_dir(proc_dir, sizeof(proc_dir)))
        {
            char xml_path[512];

            snprintf(xml_path, sizeof(xml_path), "%s/config/SYSTEM/datacenter_out.xml",
                     proc_dir);
            dc_save_out_signals_xml(xml_path);
            LOG_I("datacenter_out.xml exported to %s", xml_path);
        }
    }

    /* 纯事件等待，命令交互走 Web 前端 */
    while (g_running)
    {
        sleep(1);
    }

    LOG_I("shutting down...");

    app_sys_stop();
    dc_cleanup();
    log_cleanup();

    printf("=== RTU_ALL_AI Stopped ===\n");

    return 0;
}
