#ifndef __EPWM__H_
#define __EPWM__H_
#include "common.h"
#define		EPWM_CHANNUM	8 
/** @defgroup EPWM_Channel 
  * @{
  */ 
#define EPWM_CHAN_0    	 		0x01   
#define EPWM_CHAN_1     		0x02    
#define EPWM_CHAN_2     		0x04   
#define EPWM_CHAN_3     		0x08   
#define EPWM_CHAN_4     		0x10    
#define EPWM_CHAN_5     		0x20    
#define EPWM_CHAN_6    			0x40  
#define EPWM_CHAN_7     		0x80  
#define IS_EPWM_CHAN(CHAN)			( ((CHAN) != (uint8_t)0x00))
/** @defgroup EPWM_Source 
  * @{
  */ 
#define EPWM_SRC_TO01(chan)   	(0x00)  
#define EPWM_SRC_TO03(chan)   	(chan)

/** @defgroup EPWM_OutPhase 
  * @{
  */ 
#define EPWM_OutPhase_Normal(chan)  (0x00)  
#define EPWM_OutPhase_Reverse(chan)	(chan)  

/** @defgroup EPWM_Cutoff_t 
  * @{
  */ 
#define EPWM_CutoffSrc_None     0x00 
#define EPWM_CutoffSrc_CMP0     0x01 
#define EPWM_CutoffSrc_INTP0    0x02 
#define EPWM_CutoffSrc_EVENTC   0x03  

#define EPWM_SRising_EFalling   0x00  //cutoff start when rising edge; cutoff end when falling edge  
#define EPWM_SFalling_ERising   0x04  //cutoff start when falling edge; cutoff end when rising edge

#define EPWM_Release_Software   0x00  //software release
#define EPWM_Release_Hardware   0x08  //hardware release

#define EPWM_Release_Immediate  0x00  //cutoff release immediate when received release signal 
#define EPWM_Release_NextRising 0x10  //cutoff release at next rising edge

/** @defgroup EPWM_Cutoff_Outlevel 
  * @{
  */ 


#define EPWM_Cutoff_Out_BAN(chan)   (EPWM_GetNum(chan))  //ban cutoff
#define EPWM_Cutoff_Out_HIZ(chan)  	(1<<EPWM_GetNum(chan))  //HI-Z output
#define EPWM_Cutoff_Out_LOW(chan) 	(2<<EPWM_GetNum(chan))  //low level output
#define EPWM_Cutoff_Out_HIGH(chan)	(3<<EPWM_GetNum(chan))  //high level output


typedef struct
{
	uint8_t Source;
	uint8_t Edge;
	uint8_t ReleaseMode;
	uint8_t ReleaseTiming;
}EPWM_Cutoff_t;

typedef struct
{
	uint8_t	 EPWM_Channel;	 /*!< Specifies EPWM channel This parameter can be a value of @ref EPWM_Channel */
									 	
	uint8_t  EPWM_Source;    /*!< Specifies EPWM input source it can be : timer40 channel 1 or channel 3 output
									 This parameter can be a value of @ref EPWM_Source */
	
	uint8_t  EPWM_OutPhase;  /*!< Specifies EPWM output Phase: Normal or Reverse 
									 This parameter can be a value of @ref EPWM_OutPhase */
	
	EPWM_Cutoff_t  EPWM_CutoffPara;  /*!< Specifies EPWM cutoff paramter  
											This parameter can be a value of @ref EPWM_Cutoff_t */
	
	uint16_t  EPWM_Cutoff_Outlv;   /*!< Specifies EPWM output level when cutoff release  
											This parameter can be a value of @ref EPWM_Cutoff_Outlevel */
}EPWM_InitTypeDef;

void EPWM_Init(EPWM_InitTypeDef *EPWM_InitStruct);
uint8_t EPWM_GetNum(uint8_t channel);

#endif