#ifndef __MYPROJECT_H_
#define __MYPROJECT_H_

#include "FU6522_72.h"

#include <Definition.h>
#include <Customer.h>
#include <Parameter.h>
#include <Protect.h>


#include <FU6522_72_MDU.h>

#define     S_Value(SpeedValue)             _Q15(SpeedValue/MOTOR_SPEED_BASE)
typedef struct
{
    int16   IuOffset;       //Iu的偏置电压
    int32   IuOffsetSum;    //Iu的偏置电压总和
    int16   IvOffset;       //Iv的偏置电压
    int32   IvOffsetSum;    //Iv的偏置电压总和
    int16   Iw_busOffset;   //Iw或Ibus的偏置电压
    int32   Iw_busOffsetSum;//Iw或Ibus的偏置电压总和
    
    int16   IbusOffset;   //Ibus的偏置电压
    int32   IbusOffsetSum;//IIbus的偏置电压总和
    
    
    
    int16   OffsetCount;    //偏置电压采集计数
    int8    OffsetFlag;     //偏置电压结束标志位
    
} CurrentOffset;

extern CurrentOffset xdata mcCurOffset;
extern int16 idata Power_Currt;

extern uint8 Drv_SectionCheak(void);

extern void GetCurrentOffset(void);
extern void Motor_Ready (void);
extern void Motor_Init (void);

extern void FOC_Init(void);
extern void Motor_Charge(void);
extern void MC_Stop(void);
extern void MC_Break(void);
extern void Motor_Static_Open(void);


extern void Motor_Align(void);

typedef enum
{
    mcReady     = 0,    ///< 准备状态,该状态电机空闲，等待控制命令
    mcInit      = 1,    ///< 初始化,该状态进行启动前的变量初始化
    mcCharge    = 2,    ///< 预充电,电机启动前给自举电容充电，一般用于高压驱动，低压驱动一般不需要
    mcTailWind  = 3,    ///< 顺逆风检测,该状态下电机进行顺逆风检测
    mcPosiCheck = 4,    ///< 初始位置检测
    mcAlign     = 5,    ///< 预定位
    mcStart     = 6,    ///< 启动，用于配置启动代码
    mcRun       = 7,    ///< 运行，
    mcStop      = 8,    ///< 停止
    mcFault     = 9,    ///< 故障状态
    mcBrake     = 10,   ///< 刹车
} MotStateType;



typedef union
{
    uint8 SetMode;                                                              ///< 整个配置模式使能位
    struct
    {
        uint8 CalibFlag        : 1;                                             ///< 电流校准的标志位
        uint8 ChargeSetFlag    : 1;                                             ///< 预充电配置标志位
        uint8 AlignSetFlag     : 1;                                             ///< 预定位配置标志位
        uint8 TailWindSetFlag  : 1;                                             ///< 顺逆风配置标志位
        uint8 StartSetFlag     : 1;                                             ///< 启动配置标志位
        uint8 PosiCheckSetFlag : 1;                                             ///< 位置检测配置标志位
        uint8 Break            : 1;                                             ////</ 刹车配置标志位
    } SetFlag;
} MotStaM;



extern MotStateType data mcState;

extern MotStaM    McStaSet;

extern void MC_Control(void);


typedef struct
{
    uint16 mcDcbusFlt;                                                          // 母线电压
    uint16 mcADCCurrentbus;                                                     // 母线电流
    int16  NTCTempFlt;                                                          // NTC电压值
    uint16 PowerCal;
    uint32 PowerFlt;                                                            // 功率滤波后的值
    int16  SpeedFlt;                                                            // 当前速度滤波后的值
    
    uint8  ChargeStep;                                                          // 预充电的步骤
    uint8  CtrlMode;                                                            // 控制模式
    
    int16  Max_ia;
    int16  Max_ib;
    int16  Max_ic;
    
    uint8  Flg_ATORampEnd;
    
    uint16 Ref;                                                                 // 控制目标给定
    uint16  IqRef;                                                               // Q轴给定电流
    uint16  IdRef;                                                               // D轴给定电流
    uint16  IqSpeedRef;                                                          // Q轴速度给定电流
    
    uint8  Mode0HoldCnt;                                                        // MODE0切MODE1延迟时间计数
    
    uint16  EMFsquare;                                                             // 当前FOC_ESQU滤波后的值
    
    uint32 RunStateCnt;                                                         // 运行状态计数
    
    uint8 LoopTime;                                                            // 外环控制周期计数
    
    uint16 State_Count;                                                         // 电机各个状态的时间计数
    
    
    int16  mcPosCheckAngle;                                                   // 位置检测的角度
    
    
    uint8  CurrentAlignStatus;           // 预定位状态
    
    
    float AngleProcess;
    int16 AngleStart;
} FOCCTRL;



typedef struct
{
    uint16  RefValue;
    float  OutValue_float;
    float  IncValue;
    float  DecValue;
} MCRAMP;

extern bool isCtrlPowOn;
extern FOCCTRL              xdata mcFocCtrl;
extern MCRAMP               xdata mcRefRamp;

extern void   HardwareInit(void);
extern void   SoftwareInit(void);

extern void   TargetRef_Process(void);
extern void   Speed_response(void);
extern int16  Motor_Ramp(int16 ref);

extern void   ATORamp(void);

extern void   TickCycle_1ms(void);

extern void   Fault_GetCurrentOffset(void);
extern uint32 Abs_F32(int32 value);
extern uint16 Abs_F16(int16 value);

extern int16  PowerSpeedLimit(int16 speedref);

#define TIM3_Fre                       (750000.0)                                // TIM0计数频率750KHz
#define TIM4_Fre                       (12000000.0)                               // TIM4计数频率

/*************************************************************************************///External Function
extern void Timer1_Init(void);
extern void Timer2_Init(void);
extern void Timer3_Init(void);
extern void Timer4_Init(void);
extern void TIM4_Init_RF(void);



extern void PI_Init(void);
extern void PI2_Init(void);
extern void PI3_Init(void);




void TSD_Init(void);

void ADC_Init(void);
void AMP_Init(void);

void CMP3_Init(void);
void CMP3_Interrupt_Init(void);

unsigned short CRC_Check(unsigned char start_sector, unsigned char offset_sector);

void Driver_Init(void);

void GPIO_Init(void);

typedef enum
{
    FaultNoSource           = 0,  ///< 无故障
    FaultHardOVCurrent      = 1,  ///< 硬件过流
    FaultSoftOVCurrent      = 2,  ///< 软件过流
    FaultOverVoltageDC      = 3,  ///< 过压
    FaultUnderVoltageDC     = 4,  ///< 欠压
    FaultPhaseLost          = 5,  ///< 缺相
    FaultStall              = 6,  ///< 堵转
    FaultStart              = 7,  ///< 启动保护
    FaultFan                = 8,  ///< 风机保护
    FaultOverHeat           = 9,  ///< 电机过热保护
    FaultOverTemperature    = 10, ///< NTC过温保护
    FaultOverPower          = 11, ///<过功率
    FaultLVW                = 12, ///< LVW
    FaultGetOffset          = 13, ///< 偏置电压保护
    FaultOverSpeed          = 14,
    FaultOverLSensor        = 15,
    FaultOverRSensor        = 16,
    FaultUartLost           = 17,
    FaultFan1               = 18,
    
    FaultE      = 18,
} FaultStateType;


extern FaultStateType data mcFaultSource;

#endif