/*
 * 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 Initialize_Weight(void);
extern void Initialize_UserSetting(void);
extern void Initialize_RegenR(void);

/* USER Private extern variables */
extern WP_SwVersionTypeDef WespionVer;

extern int Debug_Status;
extern int Debug_DriveMotor;
extern int Debug_LED_Display_Level;
extern int Status_VoltRprt;
#endif /* INC_WESPION_H_ */
