/**
  *****************************************************************************
  * @file    sys_ufcs_config.c
  * @author  Solution Team
  * @version V1.00
  * @date    28-February-2023
  * @brief   UFCS configuration
  *****************************************************************************
  * @attention 
  *  Copyright (c) 2017 - 2023 Unicmicro Co., Ltd. 
  *  All Rights Reserved. 
  *****************************************************************************
  */

#include "libc.h"
#include "drivers.h"
#include "ufcs.h"
#include "sys_ufcs_config.h"

/**
 * @description:    设置供电设备输出能力
 * @param *dev      UFCS设备指针（UFCS_DEV_t *）
 * @param index     输出能力索引（0~6）
 * @param min_curr  输出能力的最小电流
 * @param max_curr  输出能力的最大电流
 * @param min_volt  输出能力的最小电压
 * @param max_volt  输出能力的最大电压
 * @param volt_step 最小电压步进
 * @param curr_step 最小电流步进
 * @return void
 */
static void sys_ufcs_cfg_src_output_set(UFCS_DEV_t *dev, 
    u8_t index, u32_t min_curr, u32_t max_curr, u32_t min_volt, 
    u32_t max_volt, u8_t volt_step, u8_t curr_step)
{
    if ((NULL == dev) || (NULL == dev->cfg) || (index >= UFCS_MAX_OUTPUT_CAP_NUM))
        return;

    ufcs_cfg_src_output_min_curr_set(dev, index, UFCS_CURRENT_VAL(min_curr));
    ufcs_cfg_src_output_max_curr_set(dev, index, UFCS_CURRENT_VAL(max_curr));
    ufcs_cfg_src_output_min_volt_set(dev, index, UFCS_VOLTAGE_VAL(min_volt));
    ufcs_cfg_src_output_max_volt_set(dev, index, UFCS_VOLTAGE_VAL(max_volt));
    ufcs_cfg_src_output_volt_step_type_set(dev, index, volt_step);
    ufcs_cfg_src_output_curr_step_type_set(dev, index, curr_step);
    ufcs_cfg_src_output_index_set(dev, index, index+1);
}

/**
 * @description:    UFCS默认配置初始化函数
 * @param *dev      UFCS设备指针（UFCS_DEV_t *）
 * @return void
 */
static void sys_ufcs_cfg_init(UFCS_DEV_t *dev)
{
    /** 设置系统调试等级为关闭 */
    sys_cfg_dbg_set(SYS_DEBUG_LEVEL_OFF); 

    /** 使能UFCS功能 */
    ufcs_cfg_enable_set(dev,TRUE);

    /** 关闭抓包模式功能，目前功能不支持 */
    ufcs_cfg_capture_mode_set(dev,FALSE);

    /** 设置UFCS设备类型为供电设备，设备类型请参考UFCS_DEV_TYPE_t */
    ufcs_cfg_dev_type_set(dev,UFCS_DEV_TYPE_SRC);

    /** 设置输出OVP使能 */
    ufcs_cfg_output_ovp_en_set(dev,TRUE);

    /** 设置输出UVP使能 */
    ufcs_cfg_output_uvp_en_set(dev,TRUE);

    /** 设置输出OCP使能 */
    ufcs_cfg_output_ocp_en_set(dev,TRUE);

    /** 设置输出SCP使能 */
    ufcs_cfg_output_scp_en_set(dev,TRUE);

    /** 设置USB接口 OTP使能 */
    ufcs_cfg_usb_otp_en_set(dev,TRUE);

    /** 设置设备内部/电池 OTP使能 */
    ufcs_cfg_dev_bat_otp_en_set(dev,TRUE);

    /** 设置CC OVP使能 */
    ufcs_cfg_cc_ovp_en_set(dev,TRUE);

    /** 设置D- OVP使能 */
    ufcs_cfg_dm_ovp_en_set(dev,TRUE);

    /** 设置D+ OVP使能 */
    ufcs_cfg_dp_ovp_en_set(dev,TRUE);

    /** 设置输入OVP使能 */
    ufcs_cfg_input_ovp_en_set(dev,TRUE);

    /** 设置输入UVP使能 */
    ufcs_cfg_input_uvp_en_set(dev,TRUE);

    /** 设置漏电流超标使能 */
    ufcs_cfg_leakage_en_set(dev,TRUE);

    /** 设置输入掉电使能 */
    ufcs_cfg_vbus_lost_en_set(dev,TRUE);

    /** 设置CRC 异常关闭输出使能 */
    ufcs_cfg_crc_protect_en_set(dev,TRUE);

    /** 设置线缆检测开关，默认关闭 */
    ufcs_cfg_cbl_det_en_set(dev,FALSE);

    /** 设置供电设备检测输出是否达标使能 */
    ufcs_cfg_src_vbus_check_set(dev,TRUE);

    /** 设置获取输出能力次数为3 */
    ufcs_cfg_n_get_output_cap_set(dev,3);

    /** 设置协议规格版本号 */
    ufcs_cfg_spec_rev_set(dev,UFCS_SPEC_VER_10);

    /** 设置看门狗接口，value为0时关闭看门狗，非零则使能并且值为看门狗超时时间，单位为毫秒 */
    ufcs_cfg_wdt_set(dev,0);

    /** 设置IC版本接口  */
    ufcs_cfg_ic_ver_set(dev,SYS_UFCS_CHIP_VER);

    /** 设置硬件版本接口  */
    ufcs_cfg_hw_ver_set(dev,SYS_UFCS_HW_VER);

    /** 设置软件版本接口  */
    ufcs_cfg_fw_ver_set(dev,SYS_UFCS_FW_VER);

    if (UFCS_DEV_TYPE_SRC == ufcs_cfg_dev_type_get(dev))
    {
        /** 设置供电设备电源配置修改标志 */
        ufcs_cfg_src_power_changed_set(dev,FALSE);

        /** 设置供电设备内部最大允许温度 */
        ufcs_cfg_src_max_temperature_set(dev,55);

        /** 设置供电设备USB接口最大允许温度 */
        ufcs_cfg_src_max_usb_temperature_set(dev,60);

        /** 设置供电设备最大电源输出模式数为2个  */
        ufcs_cfg_src_output_num_set(dev,2);
        /** 设置供电设备电源输出模式数据 */
        sys_ufcs_cfg_src_output_set(dev, 0, 500, 3000, 5000, 5900, UFCS_VOLTAGE_STEP_20mV, UFCS_CURRENT_STEP_50mA);
        sys_ufcs_cfg_src_output_set(dev, 1, 500, 3000, 5900, 11000, UFCS_VOLTAGE_STEP_20mV, UFCS_CURRENT_STEP_50mA);
    }
    else if (UFCS_DEV_TYPE_SNK == ufcs_cfg_dev_type_get(dev))
    {
        /** 设置充电设备的最大工作电流，单位 10mA */
        ufcs_cfg_snk_max_curr_set(dev,UFCS_CURRENT_VAL(3000));

        /** 设置充电设备的最大工作电压，单位 10mV */
        ufcs_cfg_snk_max_volt_set(dev,UFCS_VOLTAGE_VAL(9000));

        /** 设置充电设备的当前工作电流，单位 10mA */
        ufcs_cfg_snk_opr_curr_set(dev,UFCS_CURRENT_VAL(2000));

        /** 设置充电设备的当前工作电压，单位 10mV */
        ufcs_cfg_snk_opr_volt_set(dev,UFCS_VOLTAGE_VAL(9000));

        /** 设置充电设备电源输出模式的电压调节最小步进: 
         * 0b：10mV, 
         * 1b：20mV 
         */
        ufcs_cfg_snk_volt_step_type_set(dev,UFCS_VOLTAGE_STEP_20mV);

        /** 设置充电设备电源输出模式的电流调节最小步进：
         * 000b：10mA，
         * 001b：20mA，
         * 010b：30mA，
         * 011b：40mA，
         * 100b：50mA，
         * 其它：保留 
         */
        ufcs_cfg_snk_curr_step_type_set(dev,UFCS_CURRENT_STEP_50mA);

        /** 设置充电设备发送PING的次数，默认为5次 */
        ufcs_cfg_snk_n_ping_retry_cnt_set(dev,5);

        /** 设置充电设备内部最大允许温度 */
        ufcs_cfg_snk_max_temperature_set(dev,45);

        /** 设置充电设备USB接口最大允许温度 */
        ufcs_cfg_snk_max_usb_temperature_set(dev,60);

        /** 设置充电设备的电压调节步进，单位mV，默认为200mV */
        ufcs_cfg_snk_volt_step_set(dev,200);

        /** 设置充电设备的电流调节步进，单位mA，默认为200mA */
        ufcs_cfg_snk_curr_step_set(dev,200);
    }
    else {
        /** 设置线缆电子标签的最大承载电流，单位 1A */
        ufcs_cfg_cbl_max_curr_set(dev,7);

        /** 设置线缆电子标签的最大承载电压，单位 1V */
        ufcs_cfg_cbl_max_volt_set(dev,50);

        /** 设置线缆电子标签的线缆阻抗，单位 mOh */
        ufcs_cfg_cbl_impedance_set(dev,50);
    }

}

/**
 * @description:    系统调试等级变更时回调函数
 * @param level     调试等级
 * @return void
 */
void sys_cfg_dbg_onchange_ufcs(u32_t level)
{
    if (UFCS_USBC_DEV)
    {
        ufcs_cfg_dbg_set(UFCS_USBC_DEV, level);
    }
    else if (UFCS_USBA_DEV)
    {
        ufcs_cfg_dbg_set(UFCS_USBA_DEV, level);
    }
}

/**
 * @description:    UFCS Flash配置加载，系统初始化时调用
 * @param *dev      UFCS设备指针（UFCS_DEV_t *）
 * @return void
 */
void sys_ufcs_cfg_load(UFCS_DEV_t *dev)
{
#if FLASH_ENABLED
    if (!sys_cfg_flash_loaded_get())
    {
        sys_ufcs_cfg_init(dev);
    }
#else
    sys_ufcs_cfg_init(dev);
#endif
    ufcs_cfg_dbg_set(dev, sys_cfg_dbg_get());
    sys_cfg_onchange_hook_set(dbg2, sys_cfg_dbg_onchange_ufcs);
}

