#ifndef APP_TEST_H
#define APP_TEST_H

/***************************标准头文件***************************/
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>



//dsp专用数学计算加速指令
//#define BUILD_C66X
#ifdef BUILD_C66X
    //#include "ti/mathlib/mathlib.h"
#endif


/*************************数据类型重定义************************/
typedef signed char         INT8;
typedef unsigned char       UINT8;
typedef int                 INT16;
typedef long                INT32;
typedef long long           INT64;
typedef unsigned int        UINT16;
typedef unsigned long       UINT32;
typedef unsigned long long  UINT64;
typedef float               FLOAT32;
typedef long double         FLOAT64;


/****************************宏定义****************************/
#define IN(x)               ((dp->in.x))
#define PARM(x)             ((dp->parm.x))
#define OUT(x)              ((dp->out.x))
#define	PI2			        (FLOAT32)(6.2831853071795864769252867665590)		                  //360度
#define WC_UGRID_FILTER     (PI2 * 10.0f)
#define MAXINDEX            (6e3)                                                                 //以50us采样率、50Hz的周波为例，15个周波的采样个数即为6000=MAXPERIODNUM*TPERIOD/TS
#define MAX3(x,y,z)         (((x) > (y)) ? (((x) > (z)) ? (x) : (z)) : (((y) > (z)) ? (y) : (z))) //3个数计算最大值
#define ROUND(x)            (((x)>=0) ? ((INT32)((x)+0.5)) : ((INT32)((x)-0.5)))                  //!<四舍五入
#define DIVF32(x,y)		    (((FLOAT32)(y)==0)? 1e10 : ((x)/(FLOAT32)(y)))
#define INVF32(x)		    ((FLOAT32)(x)==0)? 1e10 : (1/(FLOAT32)(x))
#define POW2(x)             ((x) * (x))
#define POW3(x)             ((x) * (x) * (x))
#define PI2DIV3_PU          (FLOAT32)(0.3333333333333333333333333333333)                          //PI*2/3/PI2     //ssx 1207
#define L1DIV2		        (FLOAT32)(0.5)		                                                  //1/2
#define L1DIV3		        (FLOAT32)(0.3333333333333333333333333333333)		                  //1/3
#define L2DIV3		        (FLOAT32)(0.6666666666666666666666666666666)		                  //2/3
#define L1DIV6		        (FLOAT32)(0.1666666666666666666666666666666)		                  //1/6
#define L3DIV2		        (FLOAT32)(1.5)	                                  	                  //3/2


/*dsp专用的数学计算加速指令*/
#if 0
    #define DIVF32(x,y)		    (((FLOAT32)(y)==0)? 1e10 : ((x)/(FLOAT32)(y)))

    #define SQRTF(x)            sqrtf(x)
    #define SINF(x)             sinf((x)*PI2)
    #define COSF(x)             cosf((x)*PI2)
#else
    #define DIVF32(x,y)		    divsp(y,x)

    #define SQRTF(x)            sqrtsp(x)
    #define SINF(x)             sinsp((x)*PI2)
    #define COSF(x)             cossp((x)*PI2)
#endif


#define HYPOT(x,y)          SQRTF(((x)*(x)+(y)*(y)))                                              //!<求平方和的根
#define SAT(x,min,max)      (((x) > (max)) ? (max) : (((x) < (min)) ? (min) : (x)))               //!<限幅函数，输入依次为：输入变量、幅值下限、幅值上限
#define MAX(x,y)            (((x) > (y)) ? (x) : (y))                                             //!<求两个值中的最大值
#define MIN(x,y)            (((x) < (y)) ? (x) : (y))                                             //!<求两个值中的最小值

#define NTC_U1               5.0             //NTC温度测量电路驱动电压
#define IGBTNTC_SAMPLE_R     1.0             //IGBT采样电阻倒数（1/1千欧）
#define PCBNTC_SAMPLE_R      2.0             //PCB采样电阻倒数（1/0.5千欧）
#define NTC_PARA_R           0.1             //与NTC并联的电阻倒数（1/10千欧）
#define IGBTNTC_B            2.5e-4          //IGBT温度计算参数B值倒数（1/4000）
#define IGBTNTC_R25          0.0454545       //IGBT温度计算参数25℃零功率电阻值倒数（1/22千欧）
#define NTC_T1               0.003354016     //IGBT温度计算参数T1温度倒数（1/298.15开尔文）
#define PCBNTC_B             2.56410256e-4   //PCB温度计算参数B值倒数（1/3900）
#define PCBNTC_R25           0.1             //PCB温度计算参数25℃零功率电阻值倒数（1/10千欧）
#define ABSOLUTE_ZERO        273.15          //绝对零度

//八选一切换通道号，对应通道0-6（其中通道5不在此模块采样）
#define ChnNo0               0
#define ChnNo1               1
#define ChnNo2               2
#define ChnNo3               3
#define ChnNo4               4
#define ChnNo6               6



/**************************结构体定义*************************/
typedef	struct bcomponent
{
    struct bcomponent  *parent;       /*this component's parent*/
    const char *type_name;			  /*component type 's name*/
    const char *name;		          /*this component's name*/
    void       *new_component;
    void       *init_component;
    void       *pre_l1hook;
    void       *pre_l2hook;
    void       *pre_l3hook;
    void       *post_l1hook;
    void       *post_l2hook;
    void       *post_l3hook;
}Component;


typedef struct
{
    UINT16 index;       //索引值
    bool flag;          //锁相环输出标志
    FLOAT32 out;        //输出有效值
    FLOAT32 sum;        //平方和
}RMS_OBJ;

typedef struct
{
    UINT16 index;       //索引值
    FLOAT32 sum;        //数据总和
    FLOAT32 out;        //输出平均值
}AVE2_OBJ;

typedef struct
{
    UINT16 rank;        //一个计算周期内的个数
    UINT16 index;       //索引值
    FLOAT32 sum;        //数据总和
    FLOAT32 out;        //输出平均值
}DC_OBJ;


typedef struct
{
    UINT16 index;       //索引值
    FLOAT32 sum;        //数据总和
    FLOAT32 out;        //输出平均值
}AVE_OBJ;

//========================================
//一阶低通滤波器
//========================================
#if !defined(FIRST_ORDER_LOWPASS_FILTER)
#define FIRST_ORDER_LOWPASS_FILTER
typedef struct
{
    FLOAT32 y_pre;
    FLOAT32 coeff_y;
    FLOAT32 coeff_x;
} LPF_OBJ;

#endif


typedef struct
{
    /*平台提供公共部分*/
    struct bcomponent  *parent;       /*this component's parent*/
    const char *type_name;			  /*component type 's name*/
    const char *name;		          /*this component's name*/
    void       *new_component;
    void       *init_component;
    void       *pre_l1hook;
    void       *pre_l2hook;
    void       *pre_l3hook;
    void       *post_l1hook;
    void       *post_l2hook;
    void       *post_l3hook;

	//input
    struct
    {
        FLOAT32 *wt;                //锁相环角度
        FLOAT32 *GridSampleU[3];    //电网相电压三相采样值
        FLOAT32 *GridSampLineU[3];  //电网线电压三相采样值
        FLOAT32 *INVSampleU[3];     //逆变相电压三相采样值
        FLOAT32 *INVSampLineU[3];   //逆变线电压三相采样值
        FLOAT32 *ACHallI[3];        //交流电流三相采样值
        FLOAT32 *FirBATSumU;        //电池电压滤波值
        FLOAT32 *FirBUSPosHalfU;    //正半母线电压滤波值
        FLOAT32 *FirBUSNegHalfU;    //负半母线电压滤波值
        FLOAT32 *FirBUSPosQ1U;      //正四分之一母线电压滤波值
        FLOAT32 *FirBUSNegQ1U;      //负四分之一母线电压滤波值
        FLOAT32 *DCHallI;           //直流霍尔电流采样值
        FLOAT32 *Task2;             //Task2周期
    } in;

 	//param
    struct
    {
        FLOAT32 k_NTCTemp;        //NTC温度采样系数
        FLOAT32 TempNTCCali;      //NTC温度偏移量
        FLOAT32 ACVoltagePuUn;    //交流电压有效值基准值
        FLOAT32 CurrentPuIn;      //交流电流有效值基准值
        FLOAT32 Freq;             //输入信号频率
    } parm;

    //output
    struct
    {
        UINT32  PLLFlag;                //锁相环标志
        union
        {
            struct
            {
                FLOAT32 NTCVoltagePCB;     //PCB板测量电压
                FLOAT32 NTCVoltageA1;      //IGBT_A1测量电压
                FLOAT32 NTCVoltageA2;      //IGBT_A2测量电压
                FLOAT32 NTCVoltageB1;      //IGBT_B1测量电压
                FLOAT32 NTCVoltageB2;      //IGBT_B2测量电压
                FLOAT32 NTCVoltageC1;      //IGBT_C1测量电压
                FLOAT32 NTCVoltageC2;      //IGBT_C2测量电压
            };
            FLOAT32 VoltageBuff[7];
        } NTCVoltage;

        union
        {
            struct
            {
                FLOAT32 PCBTemp;         //PCB板温度
                FLOAT32 IGBTTempA1;      //IGBT_A1温度
                FLOAT32 IGBTTempA2;      //IGBT_A2温度
                FLOAT32 IGBTTempB1;      //IGBT_B1温度
                FLOAT32 IGBTTempB2;      //IGBT_B2温度
                FLOAT32 IGBTTempC1;      //IGBT_C1温度
                FLOAT32 IGBTTempC2;      //IGBT_C2温度
            };
            FLOAT32 TempBuff[7];
        } NTCTemp;
        FLOAT32 PriIGBTTempMax;         //IGBT温度最大值（未滤波）
        FLOAT32 IGBTTempMax;            //IGBT温度最大值（已滤波）
        FLOAT32 GridRmsU[3];            //电网相电压有效值
        FLOAT32 GridLineRmsU[3];        //电网线电压有效值
        FLOAT32 INVRmsU[3];             //逆变相电压有效值
        FLOAT32 INVLineRmsU[3];         //逆变线电压有效值
        FLOAT32 ACHallRmsI[3];          //交流霍尔电流有效值
        FLOAT32 ACHallRmsMaxI;          //交流霍尔电流有效值最大值
        FLOAT32 GridRmsPuU[3];          //电网相电压有效值标幺值
        FLOAT32 INVRmsPuU[3];           //逆变相电压有效值标幺值
        FLOAT32 ACHallRmsPuI[3];        //交流霍尔电流有效值标幺值
        FLOAT32 ACHallDCCompI[3];       //交流霍尔电流直流侧分量值
        FLOAT32 ACHallDCCompMaxI;       //交流霍尔电流直流侧分量最大值
        FLOAT32 GridUdq[2];             //电网电压dq变换
        FLOAT32 GridUdq_filt[2];        //电网电压dq变换滤波
        FLOAT32 INVUdq[2];              //逆变侧电压dq变换
		FLOAT32 INVUdq_filt[2];         //逆变侧电压dq变换滤波
        FLOAT32 ACHallIdq[2];           //交流霍尔电流dq变换
        FLOAT32 GridAmpU;               //电网电压幅值
        FLOAT32 INVAmpU;                //逆变电压幅值
        FLOAT32 GridPwr[2];             //电网功率
        FLOAT32 GridPFactor;            //电网功率因数
        FLOAT32 INVPwr[2];              //逆变功率
        FLOAT32 INVPFactor;             //逆变功率因数
        FLOAT32 FirDCHallI;             //直流霍尔电流滤波值
        FLOAT32 DCPwr;                  //直流侧有功功率
        FLOAT32 BUSPosQ2U;              //正四分之一母线电压（另一侧）
        FLOAT32 BUSNegQ2U;              //负四分之一母线电压（另一侧）
        FLOAT32 DCCapSumU;              //直流总电压（正半+负半）
        FLOAT32 BUSHalfMaxU;            //直流正负半母线电压最大值
        FLOAT32 BUSQ1MaxU;              //4个电容电压最大值

        FLOAT32 GridSumPower;           //电网总累计电度
        FLOAT32 GridDayPower;           //电网当日累计电度
        FLOAT32 INVSumPower;            //逆变总累计电度
        FLOAT32 INVDayPower;            //逆变当日累计电度
    } out;

    AVE2_OBJ  FirCfgDCHallI;         //直流霍尔电流滤波配置
    AVE2_OBJ  FirCfgIGBTTemp;        //IGBT温度最大值滤波配置

    RMS_OBJ GridRmsPLLCfgA;          //电网A相电压有效值配置
    RMS_OBJ GridRmsPLLCfgB;          //电网B相电压有效值配置
    RMS_OBJ GridRmsPLLCfgC;          //电网C相电压有效值配置
    RMS_OBJ INVRmsPLLCfgA;           //逆变A相电压有效值配置
    RMS_OBJ INVRmsPLLCfgB;           //逆变B相电压有效值配置
    RMS_OBJ INVRmsPLLCfgC;           //逆变C相电压有效值配置
    RMS_OBJ ACHallRmsPLLCfgA;        //交流霍尔A相电流有效值配置
    RMS_OBJ ACHallRmsPLLCfgB;        //交流霍尔B相电流有效值配置
    RMS_OBJ ACHallRmsPLLCfgC;        //交流霍尔C相电流有效值配置

    DC_OBJ ACHallMeanCfgA;        //交流霍尔A相电流直流侧分量配置
    DC_OBJ ACHallMeanCfgB;        //交流霍尔B相电流直流侧分量配置
    DC_OBJ ACHallMeanCfgC;        //交流霍尔C相电流直流侧分量配置

    LPF_OBJ low_pass_ugrid[2] ;    //电网侧电压DQ轴滤波器
	LPF_OBJ low_pass_uinv[2]  ;    //逆变侧电压DQ轴滤波器

#ifdef SIM_X64
    VOID *rte;
#endif

}METER;


typedef struct
{
    /*平台提供公共部分*/
    struct bcomponent  *parent;       /*this component's parent*/
    const char *type_name;			  /*component type 's name*/
    const char *name;		          /*this component's name*/
    void       *new_component;
    void       *init_component;
    void       *pre_l1hook;
    void       *pre_l2hook;
    void       *pre_l3hook;
    void       *post_l1hook;
    void       *post_l2hook;
    void       *post_l3hook;

	//input
    struct
    {
    } in;

 	//param
    struct
    {
        FLOAT32 k_ACvoltage;  //交流电压采样系数
        FLOAT32 k_Current;    //电流采样系数
        FLOAT32 k_DCvoltage;  //直流电压采样系数
        FLOAT32 k_Halfvoltage; //半母线电压采样系数
        FLOAT32 k_Q1voltage;  //四分之一母线电压采样系数
        FLOAT32 ACVoltageUn;  //交流电压瞬时值基准值
        FLOAT32 CurrentIn;    //电流瞬时值基准值
        FLOAT32 DCVoltageUn;  //直流电压基准值
        FLOAT32 GridCaliAB;   //电网侧AB线电压偏移量
        FLOAT32 GridCaliBC;   //电网侧BC线电压偏移量
        FLOAT32 GridCaliCA;   //电网侧CA线电压偏移量
        FLOAT32 INVCaliAB;    //逆变侧AB线电压偏移量
        FLOAT32 INVCaliBC;    //逆变侧BC线电压偏移量
        FLOAT32 INVCaliCA;    //逆变侧CA线电压偏移量
        FLOAT32 ACHallCaliA;  //霍尔A相电流偏移量
        FLOAT32 ACHallCaliB;  //霍尔B相电流偏移量
        FLOAT32 ACHallCaliC;  //霍尔C相电流偏移量
        FLOAT32 DCHallCali;   //直流霍尔电流偏移量
        FLOAT32 BATSumCali;   //电池电压偏移量
        FLOAT32 DischargeCali;    //放电电压偏移量
        FLOAT32 BUSPosHalfCali;   //正半母线电压偏移量
        FLOAT32 BUSNegHalfCali;   //负半母线电压偏移量
        FLOAT32 BUSPosQ1Cali;     //正四分之一母线电压偏移量
        FLOAT32 BUSNegQ1Cali;     //负四分之一母线电压偏移量
    } parm;

    //output
    struct
    {
        FLOAT32 GridSampLineU[3]; //电网线电压采样值
        FLOAT32 GridSampleU[3];   //电网相电压采样值
        FLOAT32 INVSampLineU[3];  //逆变线电压采样值
        FLOAT32 INVSampleU[3];    //逆变相电压采样值
        FLOAT32 ACHallI[3];       //交流电流三相采样值
        FLOAT32 DCHallI;          //直流霍尔电流采样值
        //FLOAT32 FirDCHallI;     //直流霍尔电流滤波值，移至meter模块（task2）进行滤波，仅在ad模块采样
        FLOAT32 BATSumU;          //电池电压
        FLOAT32 BUSPosHalfU;      //正半母线电压
        FLOAT32 BUSNegHalfU;      //负半母线电压
        FLOAT32 BUSPosQ1U;        //正四分之一母线电压
        FLOAT32 BUSNegQ1U;        //负四分之一母线电压
        FLOAT32 DischargeU;       //放电电压

        FLOAT32 FirBATSumU;          //电池电压滤波值
        FLOAT32 FirBUSPosHalfU;      //正半母线电压滤波值
        FLOAT32 FirBUSNegHalfU;      //负半母线电压滤波值
        FLOAT32 FirBUSPosQ1U;        //正四分之一母线电压滤波值
        FLOAT32 FirBUSNegQ1U;        //负四分之一母线电压滤波值
        FLOAT32 FirDischargeU;       //放电电压滤波值

        FLOAT32 GridPuU[3];          //电网电压三相标幺值
        FLOAT32 INVPuU[3];           //逆变电压三相标幺值
        FLOAT32 ACHallPuI[3];        //交流霍尔电流三相标幺值
        // FLOAT32 BATSumPuU;           //电池电压标幺值
        FLOAT32 BUSPosHalfPuU;       //正半母线电压标幺值
        FLOAT32 BUSNegHalfPuU;       //负半母线电压标幺值
        // FLOAT32 DischargePuU;        //放电电压标幺值
    } out;

    AVE_OBJ FirCfgBATU;           //直流电池电压滤波配置
    AVE_OBJ FirCfgDisU;           //直流放电电压滤波配置
    AVE_OBJ FirCfgPosHalfU;       //直流正半母线电压滤波配置
    AVE_OBJ FirCfgNegHalfU;       //直流负半母线电压滤波配置
    AVE_OBJ FirCfgPosQ1U;         //直流正四分之一母线电压滤波配置
    AVE_OBJ FirCfgNegQ1U;         //直流负四分之一母线电压滤波配置

}ADSAMPLE;


/*************************函数声明*************************/
/**
  这个函数是从产线代码中挑出来的，运行在Task1中，主要是进行模拟量采样，具体功能包括：
   1、对各通道模拟量码值经变比系数换算成实际值
   2、直流电压根据通道切换采样和滤波
   3、线相转换
   4、交流瞬时值标幺计算
*/
extern void runADSampleTask1(ADSAMPLE *dp);

/**
  这个函数是从产线代码中挑出来的，运行在Task2中，主要是对电压、电流进行计量处理，具体工具包括：
   1、交流相电压、电流有效值计算
   2、交流电压、电流D、Q轴计算
   3、交流电压幅值计算
   4、交流和直流功率计算
   5、交流功率因数计算
*/
extern void runMeterTask3(METER *dp);


/**
  这个函数是从产线代码中挑出来的，运行在Task3中，主要是进行绝缘电阻和温度转换，具体功能包括：
   1、绝缘电阻采样换算
   2、NTC温度采样换算
*/
extern void runMeterTask2(METER *dp);



#endif
