/*
 * WESPION.h
 *
 *  Created on: 2023. 6. 29.
 *      Author: JuHyung
 */

#ifndef INC_WESPION_H_
#define INC_WESPION_H_

/* Private includes */
#include "main.h"
#include "adc.h"
#include "dac.h"
#include "dma.h"
#include "i2c.h"
#include "spi.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
#include "flash.h"
#include "scheduler.h"

#include "math.h"

/* USER Private includes */
#include "WESPION_Def.h"
#include "WESPION_MC.h"
#include "WESPION_App.h"
#include "WESPION_BLE.h"

/* USER Private defines */
#define ANGLE_ENC   1
#define ANGLE_MR    2
#define ANGLE_MODE  ANGLE_ENC

#define FIELDWEAK_GEN   1
#define FIELDWEAK_MOT   2
#define FIELDWEAK_MODE  FIELDWEAK_GEN


#define PWM0_U (htim1.Instance->CCR1)
#define PWM0_V (htim1.Instance->CCR2)
#define PWM0_W (htim1.Instance->CCR3)
#define PWM1_U (htim8.Instance->CCR1)
#define PWM1_V (htim8.Instance->CCR2)
#define PWM1_W (htim8.Instance->CCR3)

#define MOTOR1  0x1
#define MOTOR2  0x2

#define PI            (3.1415926535897932384626433832795)
#define TWO_PI          (6.28318530717958)                  // 2pi

#define LPF(out, in, b1)  out = out-in>0 ? b1*(out-in)+ in :-b1*(in-out)+ in
#define LpfFACTOR(fc, fs, fct)  fct =  fs/(fc*TWO_PI+fs)

#define LPF_HSW(out, in, alpha) ((out) = ((1.0f - (alpha))*(out) + (alpha)*(in)))


#define SAT(in, lim)  ((in > lim) ? (lim) : ((in < -(lim)) ? -(lim) : in))
#define SAT_U(in, lim)  ((in > lim) ? (lim) : ((in <= 1) ? 1 : in))
#define SAT_Fw(in, lim)  ((in >= 0.0f) ? (0.0f) : ((in < -(lim)) ? -(lim) : in))
#define Abs(x)          ((x > 0) ? x : -x)
#define PWM_OFF         0
// HangSungWoo
#define LINEAR_INTERPOLATION(x, x1, x2, y1, y2)  (y1 + ((y2 - y1) / (x2 - x1)) * (x - x1))

#define MT_SQRT2              (1.4142135623730950488016887242097)
#define MT_SQRT3              (1.7320508075688772935274463415059)
#define MT_1_OVR_SQ3          (0.57735027f)
#define MT_1_OVR_2            (0.5f)
#define MT_1_OVR_2PAI         (0.15915494309189f)
#define MT_1_OVR_360          (0.0027777777777777777777778f)
#define MT_SQ3_OVR_2          (0.8660254046f)

#define TR_RPM2RAD            (0.1047196f)
#define TR_RAD2RPM            (9.54930f)
#define TR_ANG2RAD            (0.01745329251994329576923690768489f) // 2*pi/360
#define TR_RAD2ANG            (57.295779513082320876798154814105f)  // 360/(2pi)

/* USER Private structure */


/* USER Private extern function */
extern void Initialize_WESPION(void);
extern void Initialize_App(void);
extern void Initialize_Machine(void);
extern void Initialize_Gym(void);
extern void GymRange_Init(void);
extern void Initialize_Weight(void);
extern void Initialize_UserSetting(void);
extern void Initialize_RegenR(void);
extern void Initialize_Derating(void);
extern void Init_Encoder(void);
extern void ForcedCalibration(void);
/* USER Private extern variables */
extern WP_SwVersionTypeDef WespionVer;

extern WP_DriveStatus Drive_Status;
//extern WP_GeneralStatus AngleCali_Status;
extern int MotorCurrCtrl_Alternating;
extern WP_ActiveMotorStat Debug_DriveMotor;
extern uint8_t Debug_SkipEncInit;  // [v1.0.3] EncInit 우회 플래그
extern uint8_t Debug_HilMode;     // [v1.0.4] HIL 모드: 0=실측, 1=position 주입
extern int Debug_LED_Display_Level;
extern int Status_VoltRprt;
extern uint8_t InitialPosCali;
extern uint8_t MotorInitStart;

/* 250705) 디버깅한다고 심어놓은 uart 출력이 너무 많은 게 초기화 충돌 원인일 수 있어서 일괄적으로 선택할 수 있게 만들기 */
extern uint8_t DebugingPrintActive; // 이걸 컨트롤하면 됨.

//#ifdef DEBUG_ENCODER_CALIBRATION
//#define DEBUG_CALIB_PRINTF(...)  UART3_printf(__VA_ARGS__)
//#define DEBUG_CALIB_PUTS(str)    UART3_Puts(str)
//#else
//#define DEBUG_CALIB_PRINTF(...)
//#define DEBUG_CALIB_PUTS(str)
//#endif

#endif /* INC_WESPION_H_ */
