#include "stdio.h"
#include "version_choose.h"
#include "./V3s_ircut/V3s_ircut.h"
#include "./H3_ircut/H3_ircut.h"
#include "ircut.h"

#include "JZsdkLib.h"

static int OutPutPower = JZ_FLAGCODE_OFF;
static IrcutInfo *T_Ircut_info = NULL;
static int Ircut_Init_flag = JZ_FLAGCODE_OFF;

/**************************
 * 
 *  引脚初始化
 * 
 * 
 * *************************/
T_JZsdkReturnCode Ircut_Init(IrcutInfo ircut_info)
{
    if (T_Ircut_info != NULL)
    {
        Ircut_Init_flag = JZ_FLAGCODE_OFF;
        free(T_Ircut_info);
        T_Ircut_info = NULL;
    }

    T_Ircut_info = (IrcutInfo *)malloc(sizeof(IrcutInfo));
    if (T_Ircut_info == NULL)
    {
        JZSDK_LOG_ERROR("MODULE_IRCUT_INIT_MALLOC_ERROR");
        return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
    }
    
    memcpy(T_Ircut_info, &ircut_info, sizeof(IrcutInfo));

    //初始化对应的引脚
    if (DEVICE_VERSION == JZ_H1E || DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_H10T || 
        DEVICE_VERSION == JZ_U3  || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D  || DEVICE_VERSION == JZ_U30|| 
        DEVICE_VERSION == TF_A1  || DEVICE_VERSION == JZ_T40 || DEVICE_VERSION == JZ_H150A)
    { 
        JZsdk_V3s_Ircut_Init(T_Ircut_info);
    }

    //暂不修改为新式
    else if (DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T || DEVICE_VERSION == JZ_H10)
    {
        H3_ircut_init();
    }
    
    //暂不修改为新式
    else if (DEVICE_VERSION == JZ_C1)
    {
        //快门引脚初始化
        SysfsGPIO_Init_ircut(KT_IRC_SHUTTER_GPIO_NUM, "out");
    }
    else
    {
        JZSDK_LOG_ERROR("无引脚使用\n");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    Ircut_Init_flag = JZ_FLAGCODE_ON;

    JZSDK_LOG_INFO("MODULE_IRCUT_INIT_COMPLETE");

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

T_JZsdkReturnCode Ircut_uInit()  
{

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

//PWM控制
// 函数:Ircut_PWM_control
// 功能:控制Ircut的PWM
// 参数:pwm_num:PWM编号
// 返回值:无
int Ircut_PWM_control(int pwm_num)
{
    // 判断设备版本是否为JZ_H10T
    if (DEVICE_VERSION == JZ_H10T)
    {
        // 调用V3s_PWM_contrl函数,控制PWM
        V3s_PWM_contrl(pwm_num);
    }
}



//查询是否有开启电源控制
T_JZsdkReturnCode Ircut_CheckStatus_OutPutPower(int *value)
{
    if (DEVICE_VERSION == JZ_H10T)
    {
        *value = OutPutPower;
        
        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    }
    
    return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}



/**********************
 * 
 *  引脚控制
 * 
 * 
 * *****************/
T_JZsdkReturnCode Ircut_PinControl(E_JZ_IRC_PORT port, int index, int status)
{

    if (DEVICE_VERSION == JZ_H1E || DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_H10T || 
        DEVICE_VERSION == JZ_U3  || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D  || DEVICE_VERSION == JZ_U30|| 
        DEVICE_VERSION == TF_A1  || DEVICE_VERSION == JZ_T40 || DEVICE_VERSION == JZ_H150A)
    { 
        JZsdk_V3s_Gpio_SetPin(port, index, status);
    }

    if (DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T || DEVICE_VERSION == JZ_H10)
    {
        H3_ircut_set_amplifier(status);
    }
    
}

/*************************
 * 
 *  侧面激光引脚控制
 *  index 0 左 1 右 
 *        0 绿 1 红
 * 
 * ***********************/
T_JZsdkReturnCode Ircut_SideLaser_IrcutControl(int index, int status)
{
    if (T_Ircut_info == NULL)
    {
        JZSDK_LOG_ERROR("Ircut_info is NULL");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }
    
    if (index == 0 && T_Ircut_info->SideLight_Right_Pin.Enable == JZ_FLAGCODE_ON)
    {
        Ircut_PinControl(T_Ircut_info->SideLight_Right_Pin.Port, 
            T_Ircut_info->SideLight_Right_Pin.index,
            status);
    }
    else if (index == 1 && T_Ircut_info->SideLight_Right_Pin.Enable == JZ_FLAGCODE_ON)
    {
        Ircut_PinControl(T_Ircut_info->SideLight_Left_Pin.Port, 
            T_Ircut_info->SideLight_Left_Pin.index,
            status);
    }
    
    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}


/***********************************
 * 
 *  功放开关
 * 
 * 
 * ********************************/
T_JZsdkReturnCode set_amplifier(int amplifier_mode)
{
    if (T_Ircut_info == NULL)
    {
        JZSDK_LOG_ERROR("Ircut_info is NULL");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    if (T_Ircut_info->Amplifiter_Pin.Enable != JZ_FLAGCODE_ON)
    {
        JZSDK_LOG_ERROR("Amplifiter_Pin is not enable");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }
    
    Ircut_PinControl(T_Ircut_info->Amplifiter_Pin.Port,
        T_Ircut_info->Amplifiter_Pin.index,
        amplifier_mode);

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/***********************************
 * 
 *   对外电源控制
 * 
 * 
 * ********************************/
T_JZsdkReturnCode Ircut_Set_OutPutPower_Control(int value)
{

    if (T_Ircut_info == NULL)
    {
        JZSDK_LOG_ERROR("Ircut_info is NULL");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    if (T_Ircut_info->OutPutPower_Pin.Enable != JZ_FLAGCODE_ON)
    {
        JZSDK_LOG_ERROR("OutPutPower_Pin is not enable");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    if (DEVICE_VERSION == JZ_H10T)
    {
        if (value == JZ_FLAGCODE_OFF || value == JZ_FLAGCODE_ON)
        {
            
            Ircut_PinControl(T_Ircut_info->OutPutPower_Pin.Port,
                T_Ircut_info->OutPutPower_Pin.index,
                value);
            OutPutPower = value;
            return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
        }
    }
    
    return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}