#include "data_telemet_common.h"
#include "head.h"
#include "bsp_type.h"
#include "MmiData.h"

/* ====================================================================================================================
 * 文件名称: data_telemet_common.c
 * 文件职责: 公共遥测取值模块实现 - 统一封装遥测取值、零抑制、一次二次值换算等逻辑
 * 架构位置: Data层公共模块
 * ==================================================================================================================== */

/**
 * @brief  获取遥测显示值（公共封装接口）
 * @param  sw        开关号 0：公共，1~16：开关1~16
 * @param  ac_index  交流量索引
 * @param  type      显示类型
 * @return 处理后的遥测值
 * @note   统一封装遥测取值、零抑制、PT/CT比例换算逻辑
 */
float data_telemet_get_value(int32_t sw, uint16_t ac_index, GET_TYPE type)
{
    float value = 0;
    data_bool_t bconvert = false;

    /* 参数检查 */
    if (ac_index > PUB_AC_NUM_ALL || sw > SWITCH_NUM_MAX)
    {
        printf("%s 液晶遥测数据索引错误! sw: %d, ac_index: %d\r\n", __func__, sw, ac_index);
        return value;
    }

    /* 原始值读取 */
    if (sw == 0) // 公共遥测
    {
        if (ac_index < PUB_AC_NUM_ALL)
        {
            if (pRunSet->bTT_RET_ZERO)
            {
                if (abs(g_sw_pub.ac_in[ac_index]) > g_unit[g_pub_ac_desc[ac_index].unit].zero)
                {
                    value = (float)(g_sw_pub.ac_in[ac_index] / 65536.0);
                }
                else
                {
                    value = 0;
                }
            }
            else
            {
                value = (float)(g_sw_pub.ac_in[ac_index] / 65536.0);
            }
        }
        else
        {
            return 0; // 参数错误直接返回0
        }
    }
    else // 开关遥测
    {
        if (ac_index < SW_AC_NUM_ALL)
        {
            if (pRunSet->bTT_RET_ZERO)
            {
                if (abs(g_sw[sw - 1].ac_in[ac_index]) > g_unit[g_sw_ac_desc[ac_index].unit].zero)
                {
                    value = (float)(g_sw[sw - 1].ac_in[ac_index] / 65536.0);
                }
                else
                {
                    value = 0;
                }
            }
            else
            {
                value = (float)(g_sw[sw - 1].ac_in[ac_index] / 65536.0);
            }
        }
        else
        {
            return 0; // 参数错误直接返回0
        }
    }

    /* 换算开关判断 */
    switch (type)
    {
    case TYPE_MAINPAGE:
        /* 主界面类型：根据bTT_ShowOne配置决定是否换算 */
        if (!pRunSet->bTT_ShowOne)
        {
            bconvert = true;
        }
        break;

    case TYPE_YCDISPLY_PRIMARY:
        /* 一次值类型：强制换算 */
        bconvert = true;
        break;

    case TYPE_YCDISPLY_SECONDY:
        /* 二次值类型：不进行换算 */
        bconvert = false;
        break;

    default:
        break;
    }

    /* PT/CT比例换算 */
    if (bconvert)
    {
        if (sw == 0) // 公共遥测 - 电压换算
        {
            if (ac_index < PUB_AC_NUM)
            {
                if (ac_index < PUB_AC_UA2)
                {
                    /* A侧电压：U01使用零序PT，其他使用A侧PT */
                    value *= (ac_index == PUB_AC_U01) ? 
                        (pRunSet->a_zpt_one / pRunSet->a_zpt_two) : 
                        (pRunSet->a_pt_one / pRunSet->a_pt_two);
                }
                else
                {
                    /* B侧电压：U02使用零序PT，其他使用B侧PT */
                    value *= (ac_index == PUB_AC_U02) ? 
                        (pRunSet->b_zpt_one / pRunSet->b_zpt_two) : 
                        (pRunSet->b_pt_one / pRunSet->b_pt_two);
                }
            }
            // 其它遥测数值不变
        }
        else // 开关遥测 - 电流换算
        {
            if (ac_index < SW_AC_NUM)
            {
                /* 电流换算：I0使用CT0，其他使用CT */
                value *= (ac_index == SW_AC_I0) ? 
                    (pRunSet->ct0_one / pRunSet->ct0_two) : 
                    (pRunSet->ct_one / pRunSet->ct_two);
            }
            else
            {
                /* 功率等参数换算 */
                if (ac_index < SW_AC_IN_COS)
                {
                    /* 功率类：根据PT一次值单位判断使用kV还是V */
                    if (pRunSet->a_pt_one < 15) // PT一次值单位为kV
                    {
                        value *= pRunSet->a_pt_one / pRunSet->a_pt_two * pRunSet->ct_one / pRunSet->ct_two;
                    }
                    else
                    {
                        value *= pRunSet->a_pt_one / 1000 / pRunSet->a_pt_two * pRunSet->ct_one / pRunSet->ct_two;
                    }
                }
            }
        }
    }

    return value;
}
