/*
 * WESPION_MC.h
 *
 *  Created on: Jul 8, 2023
 *      Author: JuHyung
 */

#ifndef INC_WESPION_MC_H_
#define INC_WESPION_MC_H_

/* Private includes */
#include "WESPION_Def.h"
#include "main.h"

/* USER Private includes */

/* USER Private defines */
typedef enum
{
  WP_Gate_EN = 0U,
  WP_Gate_DIS = !WP_Gate_EN
} GateICstatus;

#define Motor1En(x)   digitalWrite(1, x)
#define Motor2En(x)   digitalWrite(2, x)

/* USER Private extern function */
extern void WESPION_MotorControl(void);
extern void WESPION_MotorAddon(void);

extern void MotorCtrl_StateMachine(void);
extern void MotorControl_ErrChk(WP_MotorControllerErrorTypeDef *_err, WP_ErrorValueTypeDef *_errRef, WP_MotorAxisTypeDef *_fb, WP_MotorAngleTypeDef *_ang, WP_InverterAdOffsetTypeDef *_off);
extern void Controller_ErrChk(WP_ControllerErrorTypeDef *_err, WP_ErrorValueTypeDef *_errRef, WP_InverterControlTypeDef *_inv);
extern void MotorCurControl(void);
extern void Motor1CurCtrl(void);
extern void Motor2CurCtrl(void);
extern void MotorSpdControl(void);
extern void Motor1SpdCtrl(void);
extern void Motor2SpdCtrl(void);

extern void InvAdcGet(void);
extern void MotorCtrl_FeedbackCal(void);
extern void MotorCtrl_TransformAngle(WP_MotorAngleTypeDef *angle, float cmd, float tsamp);
extern void MotorCtrl_XbyF_Ctrl(float fc, float *Angle, float SampT);

extern void Inverter_Comm(void);
extern void Inverter_Comm1ms(void);
extern void Inverter_CommEnable(void);
extern void InvComAdcGet(void);
extern void Inverter_CommDataCal(void);

extern void MotorCtrl_Initialize(void);
extern void Motor1Ctrl_VariSetZero(void);
extern void Motor2Ctrl_VariSetZero(void);
extern void Motor1Ctrl_PwmStart(void);
extern void Motor2Ctrl_PwmStart(void);
extern void Motor1Ctrl_PwmStop(void);
extern void Motor2Ctrl_PwmStop(void);

extern void WP_ClarkeParkTrans(WP_Motor3PhaseTypeDef *_3, WP_MotorDQTypeDef *s, WP_MotorDQTypeDef *e, WP_MotorAngleTypeDef *Angle);
extern void WP_InvClarkeParkTrans(WP_Motor3PhaseTypeDef *_3, WP_MotorDQTypeDef *s, WP_MotorDQTypeDef *e, WP_MotorAngleTypeDef *Angle);
extern void WP_InvMinMax(WP_Motor3PhaseTypeDef *_3in, WP_Motor3PhaseTypeDef *_3out, float Vlim);
extern float WP_PIcontrol(float Cmd, float Fedb, WP_PITypeDef *PiCur, WP_GainTypeDef *Gain, float VRefLim);

extern float WP_PIcontrol_Spdlim (float Cmd, float Fedb, WP_PITypeDef *PiCur, WP_GainTypeDef *Gain, float VRefLim, float rpm);///somebp 2024.02.02

extern float WP_PIcontrolForFieldWeak(float Cmd, float Fedb, WP_PITypeDef *PiCur, WP_GainTypeDef *Gain, float VRefLim);
extern void WP_PwmScale(uint32_t* Duty, WP_Motor3PhaseTypeDef *_3V, float *Rt, WP_InverterTypeDef *inv);
extern WP_ErrorStatus WP_PWMout(uint8_t Mot, uint32_t* Duty);
extern void WP_RampUpDn(float *Cmd, float *Ref, float RampU, float RampD);
extern void WP_MrPos(WP_MotorAngleTypeDef *Ang);
extern WP_ErrorStatus WP_EncPos(uint8_t Mot, WP_MotorAngleTypeDef *Ang);
extern WP_ErrorStatus WP_EncSpd(uint8_t Mot, WP_MotorAngleTypeDef *Ang);



extern void TestEnc(void);
extern void TestPWM(void);

/* USER Private extern variables */
extern uint8_t CtrlFlg;

extern WP_ControllerTypeDef WP_Ctrl;
extern WP_ControllerErrorTypeDef WP_CtrlErr;
extern WP_ErrorValueTypeDef WP_ErrRef;

extern WP_InverterTypeDef Inv;

extern WP_MotorAngleTypeDef Motor1_Ang, Motor2_Ang;
extern WP_MotorContrlTypeDef Motor1, Motor2;

extern WP_InverterADrawdataTypeDef ADinj;

extern WP_InverterLpfTypeDef LpfCur, LpfVdc, LpfSpd;

extern float AngleMech, AngleMechAll;


#endif /* INC_WESPION_MC_H_ */
