#include "../adapter/pe_adapter.h"
#include <string.h>
#include "../common.h"
// PCS
//
#define XINHUASAN_POWER_SET           "ActPowSet"
#define XINHUASAN_POWER_READ          "ActivePower"
#define XINHUASAN_REPOWER_SET         "ReactPowSet"
#define XINHUASAN_REPOWER_READ        "ReactivePower"

#define XINHUASAN_A_POWER_SET         "ASplitPhaseActPowSet"
#define XINHUASAN_B_POWER_SET         "BSplitPhaseActPowSet"
#define XINHUASAN_C_POWER_SET         "CSplitPhaseActPowSet"
#define XINHUASAN_A_POWER_READ        "AphaseActPower"
#define XINHUASAN_B_POWER_READ        "BphaseActPower"
#define XINHUASAN_C_POWER_READ        "CphaseActPower"
#define XINHUASAN_A_REPOWER_SET       "ASplitPhaseReactPowSet"
#define XINHUASAN_B_REPOWER_SET       "BSplitPhaseReactPowSet"
#define XINHUASAN_C_REPOWER_SET       "CSplitPhaseReactPowSet"
#define XINHUASAN_A_REPOWER_READ      "AphaseReactivePower"
#define XINHUASAN_B_REPOWER_READ      "BphaseReactivePower"
#define XINHUASAN_C_REPOWER_READ      "CphaseReactivePower"

#define XINHUASAN_MODE_SET            "WorkMode"
#define XINHUASAN_MODE_READ           "RunStatu"
#define XINHUASAN_GRID_CONNECT_SET    "SetConnect"
#define XINHUASAN_GRID_CONNECT        "GridOnOff"
#define XINHUASAN_UP_SET              "PCSStart"
#define XINHUASAN_DOWN_SET            "PCSStop"
#define XINHUASAN_ONOFF_READ          "Stoppage"    //停机

#define TYPE_XINHUASAN 0
#define TYPE_XINHUASAN_3P4W 1

enum grid_onff
{
    GRID_ON = 0,
    GRID_OFF,
};

int xinhuasan_pcs_init(pe_class *this_p, void *par)
{
    return 0;
}

int xinhuasan_pcs_set_power(pe_class *this_p, double power)
{
    switch (this_p->compatible_index)
    {
        case  TYPE_XINHUASAN:
            dev_set_dev_tag_float(this_p->no, XINHUASAN_POWER_SET, power);
        break;
        case  TYPE_XINHUASAN_3P4W:
            dev_set_dev_tag_float(this_p->no, XINHUASAN_A_POWER_SET, power/3);
            dev_set_dev_tag_float(this_p->no, XINHUASAN_B_POWER_SET, power/3);
            dev_set_dev_tag_float(this_p->no, XINHUASAN_C_POWER_SET, power/3);
        break;
    }
    return 0;
}

int xinhuasan_pcs_set_repower(pe_class *this_p, double repower)
{

    switch (this_p->compatible_index)
    {
        case  TYPE_XINHUASAN:
             dev_set_dev_tag_float(this_p->no, XINHUASAN_REPOWER_SET, repower);
        break;
        case  TYPE_XINHUASAN_3P4W:
            dev_set_dev_tag_float(this_p->no, XINHUASAN_A_REPOWER_SET, repower/3);
            dev_set_dev_tag_float(this_p->no, XINHUASAN_B_REPOWER_SET, repower/3);
            dev_set_dev_tag_float(this_p->no, XINHUASAN_C_REPOWER_SET, repower/3);
        break;
    }
   
    return 0;
}

int xinhuasan_pcs_set_mode(pe_class *this_p, int mode)
{
    dev_set_dev_tag_int(this_p->no, XINHUASAN_MODE_SET, mode);
    return 0;
}

int xinhuasan_pcs_set_onoff(pe_class *this_p, int onoff)
{
    switch (onoff)
    {
        case PE_ADP_OFF:
        dev_set_dev_tag_int(this_p->no, XINHUASAN_DOWN_SET, true);
        break;
        case PE_ADP_ON:
        dev_set_dev_tag_int(this_p->no, XINHUASAN_UP_SET, true);
        break;
    }
    return 0;
}
int xinhuasan_pcs_set_connect(pe_class *this_p, int connect)
{
    if (PE_ADP_CONNECT_GRID == connect)
        dev_set_dev_tag_int(this_p->no, XINHUASAN_GRID_CONNECT_SET, GRID_ON);
    if (PE_ADP_DISCONNECT_GRID == connect)
        dev_set_dev_tag_int(this_p->no, XINHUASAN_GRID_CONNECT_SET, GRID_OFF);
    return 0;
}

int xinhuasan_pcs_get_power(pe_class *this_p, double *power)
{

    switch (this_p->compatible_index)
    {
        case  TYPE_XINHUASAN:
            *power = dev_get_dev_tag_int(this_p->no, XINHUASAN_POWER_READ);
        break;
        case  TYPE_XINHUASAN_3P4W:
            *power = dev_get_dev_tag_int(this_p->no, XINHUASAN_A_POWER_READ);
            *power = dev_get_dev_tag_int(this_p->no, XINHUASAN_B_POWER_READ);
            *power = dev_get_dev_tag_int(this_p->no, XINHUASAN_C_POWER_READ);
        break;
    }
    
    return 0;
}

int xinhuasan_pcs_get_repower(pe_class *this_p, double *repower)
{

    switch (this_p->compatible_index)
    {
        case  TYPE_XINHUASAN:
            *repower = dev_get_dev_tag_int(this_p->no, XINHUASAN_REPOWER_READ);
        break;
        case  TYPE_XINHUASAN_3P4W:
            *repower = dev_get_dev_tag_int(this_p->no, XINHUASAN_A_REPOWER_READ);
            *repower = dev_get_dev_tag_int(this_p->no, XINHUASAN_B_REPOWER_READ);
            *repower = dev_get_dev_tag_int(this_p->no, XINHUASAN_C_REPOWER_READ);
        break;
    }
    
    return 0;
}

int xinhuasan_pcs_get_mode(pe_class *this_p, int *mode)
{
    *mode = dev_get_dev_tag_int(this_p->no,XINHUASAN_MODE_READ);
    return 0;
}

int xinhuasan_pcs_get_onoff(pe_class *this_p, int *onoff)
{
    if (dev_get_dev_tag_int(this_p->no,XINHUASAN_ONOFF_READ))
    {
        *onoff = 0;
    }
    else
    {
        *onoff = 1;
    }
    return 0;
}

int xinhuasan_pcs_get_connect(pe_class *this_p, int *connect)
{
    if (dev_get_dev_tag_int(this_p->no, XINHUASAN_GRID_CONNECT))
    {
        *connect = PE_ADP_DISCONNECT_GRID;
    }
    else
    {
        *connect = PE_ADP_CONNECT_GRID;
    }
    return 0;
}

int xinhuasan_pcs_set_value(pe_class* this_p, const char* function, double value)
{
    if (strcmp(function, FUNCTION_SET_POWER) == 0)
    {
        return xinhuasan_pcs_set_power(this_p, value);
    }
    else if (strcmp(function, FUNCTION_SET_REPOWER) == 0)
    {
        return xinhuasan_pcs_set_repower(this_p, value);
    }
    else if (strcmp(function, FUNCTION_SET_MODE) == 0)
    {
        return xinhuasan_pcs_set_mode(this_p, (int)value);
    }
    else if (strcmp(function, FUNCTION_SET_ONOFF) == 0)
    {
        return xinhuasan_pcs_set_onoff(this_p, (int)value);
    }
    else if (strcmp(function, FUNCTION_SET_CONNECT) == 0)
    {
        return xinhuasan_pcs_set_connect(this_p, (int)value);
    }
    else
    {
        return adapter_function_set(this_p, function, value);
    }
    return -1;
}

int xinhuasan_pcs_get_int_value(pe_class* this_p, const char* function, int* value)
{
    if (strcmp(function, FUNCTION_GET_ONOFF) == 0)
    {
        return xinhuasan_pcs_get_onoff(this_p, value);
    }
    else if (strcmp(function, FUNCTION_GET_MODE) == 0)
    {
        return xinhuasan_pcs_get_onoff(this_p, value);
    }
    else if (strcmp(function, FUNCTION_GET_CONNECT) == 0)
    {
        return xinhuasan_pcs_get_onoff(this_p, value);
    }
    else
    {
        return adapter_function_get_int(this_p, function, value);
    }
    return -1;
}

int xinhuasan_pcs_get_double_value(pe_class* this_p, const char* function, double* value)
{
    if (strcmp(function, FUNCTION_GET_POWER) == 0)
    {
        return xinhuasan_pcs_get_power(this_p, value);
    }
    else if (strcmp(function, FUNCTION_GET_REPOWER) == 0)
    {
        return xinhuasan_pcs_get_repower(this_p, value);
    }
    else
    {
        return adapter_function_get_double(this_p, function, value);
    }
    return -1;
}

static char *xinhuasan_pcs_compatible_arr[] = {"xinhuasan", "xinhuasan-3p4w",NULL};

pe_adapter xinhuasan_pcs_adp __at_pe_adp_section = {
    .compatible = xinhuasan_pcs_compatible_arr, // 属性
    //
    .init = xinhuasan_pcs_init,
    //
    .set_power = xinhuasan_pcs_set_power,
    .set_repower = xinhuasan_pcs_set_repower,
    .set_mode = xinhuasan_pcs_set_mode,
    .set_onoff = xinhuasan_pcs_set_onoff,
    .set_connect = xinhuasan_pcs_set_connect,
    //
    .get_power = xinhuasan_pcs_get_power,
    .get_repower = xinhuasan_pcs_get_repower,
    .get_mode = xinhuasan_pcs_get_mode,
    .get_onoff = xinhuasan_pcs_get_onoff,
    .get_connect = xinhuasan_pcs_get_connect,

    .set_value        = xinhuasan_pcs_set_value,
    .get_int_value    = xinhuasan_pcs_get_int_value,
    .get_double_value = xinhuasan_pcs_get_double_value,
};
