/*
 * mppt_control.c
 *
 *  Created on: 2024年6月29日
 *      Author: psx
 */

#include "mppt_control.h"
#include "collect_Conversion.h"
#include "pwm.h"
#include "inflash.h"
#include "gpio.h"

SL_Mppt_para g_Mppt_Para = {0};

static void TrickleCharge(void);
static void ConstantCurrentCharge(void);
static void ConstantVoltageCharge(void);
static void FloatingCharge(void);

#define TrickleV 10
#define ConstantCurrentV 13
#define ConstantVoltageV 14
#define FloatingV 14

float duty_ratio = 0.5;
/**
  * @brief  得到输出的功率
  * @param
  * @retval OutputPower 输出功率
  */
static float Get_OutputPower(void)
{
    static float OutputPower;
    static float V_out, I_out;
//    float V_out_array[array_num];
//    float I_out_array[array_num];
//    float V_temp = 0;
//    float I_temp = 0;

//    for (int var = 0; var < array_num; ++var) {
//        I_out_array[var] = get_CHG_CURR();
//        V_out_array[var] = get_PV_VOLT_OUT();
//        Delay_Ms(1);
//    }
//
//    for (int var = 0; var < array_num; ++var) {
//        I_temp += I_out_array[var];
//        V_temp += V_out_array[var];
//    }

//    for (int var = 0; var < array_num; ++var) {
//        I_temp += get_CHG_CURR();
//        V_temp += get_PV_VOLT_OUT();
//        Delay_Ms(1);
//    }
//    V_out = V_temp / array_num;
//    I_out = I_temp / array_num;

    V_out = get_PV_VOLT_OUT();
    I_out = get_CHG_CURR();

    OutputPower = V_out * I_out;

    printf(" V = %d/100, I = %d/10000, OutputPower = %d/10000 \r\n",
            (int)(V_out*100), (int)(I_out * 10000), (int)(OutputPower * 10000));

    return OutputPower;
}

/**
  * @brief  使用的为扰动干扰法,调整输出电压,使功率输出最大
  * @param
  * @retval
  */
/* pwm占空比调节步长 */
const float step1_pwm = 0.01;
const float step2_pwm = 0.001;
//#define array_num 10
void mppt_readJust(void)
{
    static float last_duty_ratio = 0.5;
    static float now_duty_ratio;
    static float last_OutputPower;
    static float now_OutputPower;
    static float step_pwm = step1_pwm;

    last_OutputPower = Get_OutputPower();

    printf(" duty_ratio = %d/1000 \r\n", (int)(last_duty_ratio * 1000));

    /* 正向调节查看功率是否会变大 */
    now_duty_ratio = last_duty_ratio + step_pwm;
    if (now_duty_ratio > 1) {
        now_duty_ratio = 1;
    }
    Set_duty_ratio(now_duty_ratio);
    now_OutputPower = Get_OutputPower();
    if (now_OutputPower > last_OutputPower) {
        printf(" now_OutputPower > last_OutputPower1 \r\n");
        last_duty_ratio = now_duty_ratio;
        return;
    }

    /* 负向调节查看功率是否会变大 */
    now_duty_ratio = last_duty_ratio - step_pwm;
    if (now_duty_ratio < 0) {
        now_duty_ratio = 0;
    }
    Set_duty_ratio(now_duty_ratio);
    now_OutputPower = Get_OutputPower();
    if (now_OutputPower > last_OutputPower) {
        printf(" now_OutputPower > last_OutputPower2 \r\n");
        last_duty_ratio = now_duty_ratio;
        return;
    }

    /* 正负向调节功率均未变大，此时设置功率为原来的点 */
    Set_duty_ratio(last_duty_ratio);
//    step_pwm = step2_pwm;
}

void printf_data(void)
{
    printf("\n");
    get_CHG_CURR();
    get_PV_VOLT_OUT();
    get_DSG_CURR();
    get_PV1_VOLT_IN();
    get_PV_VOLT_IN1();
    get_MOSFET_Temper();
    get_PV2_VOLT_IN();
    printf("\n");
}

/**
  * @brief  恒定输入电压
  * @param
  * @retval
  *
  */
void mppt_constantVoltage(float InVoltage)
{
//    float temp = get_PV_VOLT_OUT();
//    Set_duty_ratio(0);
//    Delay_Ms(500);
//    float PV1_V = get_PV1_VOLT_IN();
//
//    float constant_V = 0.78 * PV1_V;
//
//    temp = temp / constant_V;
//
//    Set_duty_ratio(temp);

//    static float duty_ratio = 0.5;
    static uint8_t ConstantVoltageFlag = 1;
//    if (ConstantVoltageFlag) {
////        Set_duty_ratio(0);
////        Delay_Ms(500);
//        float temp = get_PV_VOLT_OUT();
//        temp = temp / InVoltage;
//        Set_duty_ratio(temp);
//        ConstantVoltageFlag = 0;
//    }

//    Set_duty_ratio(0);
//    Delay_Ms(500);
    float PV1_V = get_PV1_VOLT_IN();

    if (ConstantVoltageFlag) {
        if (PV1_V > InVoltage) {
            duty_ratio += step1_pwm;
            Set_duty_ratio(duty_ratio);
        } else {
            duty_ratio -= step1_pwm;
            Set_duty_ratio(duty_ratio);
        }

        if (PV1_V - InVoltage < 0.1) {
            ConstantVoltageFlag = 0;
        }
    } else {
        if (PV1_V > InVoltage) {
            duty_ratio += step2_pwm;
            Set_duty_ratio(duty_ratio);
        } else {
            duty_ratio -= step2_pwm;
            Set_duty_ratio(duty_ratio);
        }

        if (PV1_V - InVoltage > 0.1) {
            ConstantVoltageFlag = 1;
        }
    }

}


/**
  * @brief  涓流充电
  * @param
  * @retval
  *
  */
void TrickleCharge(void)
{


}

/**
  * @brief  恒流充电（大电流充电），mppt最大功率充电
  * @param
  * @retval
  *
  */
void ConstantCurrentCharge(void)
{


}

/**
  * @brief  恒压充电
  * @param
  * @retval
  *
  */
void ConstantVoltageCharge(void)
{


}

/**
  * @brief  浮充充电
  * @param
  * @retval
  *
  */
void FloatingCharge(void)
{


}

void MpptContorl(void)
{
    /* 后续可以添加考虑减少放电电流的影响，或停止放电的时候判断 */
    float OutputVoltage = get_PV_VOLT_OUT();

    if (TrickleV > OutputVoltage) {
        TrickleCharge();
    } else if (ConstantCurrentV > OutputVoltage) {
        ConstantCurrentCharge();
    } else if (ConstantVoltageV > OutputVoltage) {
        ConstantVoltageCharge();
    } else {
        FloatingCharge();
    }
}

void test(void)
{
//    mppt_readjust();
//    Get_OutputPower();

    mppt_constantVoltage(19);
//    printf_data();
//    void MpptContorl();
}


