/**
*     Copyright (c) 2022, Nations Technologies Inc.
* 
*     All rights reserved.
*
*     This software is the exclusive property of Nations Technologies Inc. (Hereinafter 
* referred to as NATIONS). This software, and the product of NATIONS described herein 
* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties
* of the People's Republic of China and other applicable jurisdictions worldwide.
*
*     NATIONS does not grant any license under its patents, copyrights, trademarks, or other 
* intellectual property rights. Names and brands of third party may be mentioned or referred 
* thereto (if any) for identification purposes only.
*
*     NATIONS reserves the right to make changes, corrections, enhancements, modifications, and 
* improvements to this software at any time without notice. Please contact NATIONS and obtain 
* the latest version of this software before placing orders.

*     Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes 
* no responsibility for the accuracy and reliability of this software.
* 
*     It is the responsibility of the user of this software to properly design, program, and test 
* the functionality and safety of any application made of this information and any resulting product. 
* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or 
* consequential damages arising in any way out of the use of this software or the Product.
*
*     NATIONS Products are neither intended nor warranted for usage in systems or equipment, any
* malfunction or failure of which may cause loss of human life, bodily injury or severe property 
* damage. Such applications are deemed, "Insecure Usage".
*
*     All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS 
* harmless from and against all claims, costs, damages, and other liabilities, arising from or related 
* to any customer's Insecure Usage.

*     Any express or implied warranty with regard to this software or the Product, including,but not 
* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement
* are disclaimed to the fullest extent permitted by law.

*     Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe
* or otherwise distribute this software for any purposes, in whole or in part.
*
*     NATIONS products and technologies shall not be used for or incorporated into any products or systems
* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. 
* User shall comply with any applicable export control laws and regulations promulgated and administered by 
* the governments of any countries asserting jurisdiction over the parties or transactions.
**/
 
/**
*\*\file n32a003_comp.h
*\*\author Nations
*\*\version v1.0.0
*\*\copyright Copyright (c) 2022, Nations Technologies Inc. All rights reserved.
**/

#ifndef __N32A003_COMP_H
#define __N32A003_COMP_H

#ifdef __cplusplus
 extern "C" {
#endif

#include "n32a003.h"
#include <stdbool.h> 
	 
/** Bit operation definition **/
#define SetBitMsk(reg, bit, msk) ((reg) = ((reg) & ~(msk) | (bit)))
#define ClrBit(reg, bit)         ((reg) &= ~(bit))
#define SetBit(reg, bit)         ((reg) |= (bit))
#define GetBit(reg, bit)         ((reg) & (bit))	 
	 
/** COMP init structure definition **/
typedef struct
{
    /* ctrl define */         
    uint32_t Blking;             /* Specifies which timer can control the comp output blanking with its capture event */
    uint32_t Hyst;               /* Specifies the comp hysteresis level with low/medium/high level */
    uint32_t PolRev;             /* Specifies the comp output polarity */
    uint32_t OutSel;             /* Specifies which timer input that can be connecte to the comp output */
    uint32_t SubSel;             /* Specifies the comp subtract level with 0/100mv/200mv/300mv level */
	uint32_t InpSel;             /* Specifies the comp inpsel */
    uint32_t InmSel;             /* Specifies the comp inmsel */
    uint32_t En;                 /* enable or disable the comp */

    /* filter define */
    uint8_t SampWindow;          /* Initializes comp sampwindow value ~5bit */
    uint8_t Threshold;           /* ~5bit ,need > SampWindow/2 */
    uint8_t FilterEn;            /* enable or disable the comp filter */

    /* filter prescale */
    uint16_t ClkPsc;             /* Initializes comp clkpsc value ~5bit */
} COMP_InitType;

/** COMP blanking definition **/
#define COMP_BLANKING_MASK                ((uint32_t)(~COMP_CTRL_BLKING))
#define COMP_BLANKING_NO                  ((uint32_t)0x00000000)
#define COMP_BLANKING_TIM1_OC5            ((uint32_t)COMP_CTRL_BLKING)

/** COMP hysteresis definition **/
#define COMP_HYST_MASK                    ((uint32_t)(~COMP_CTRL_HYST))
#define COMP_HYST_NO                      ((uint32_t)0x00000000)
#define COMP_HYST_LOW                     ((uint32_t)COMP_CTRL_HYST_0)
#define COMP_HYST_MID                     ((uint32_t)COMP_CTRL_HYST_1)
#define COMP_HYST_HIGH                    ((uint32_t)(COMP_CTRL_HYST_0 | COMP_CTRL_HYST_1))

/** COMP output polarity definition **/
#define COMP_OUTPOL_MASK                  ((uint32_t)(~COMP_CTRL_POL))
#define COMP_OUTPOL_FLIP                  ((uint32_t)COMP_CTRL_POL)
#define COMP_OUTPOL_NFLIP                 ((uint32_t)0x00000000)

/** COMP subtract definition **/
#define COMP_SUB_MASK                     ((uint32_t)(~COMP_CTRL_CMPVOS))
#define COMP_SUB_NO                       ((uint32_t)0x00000000)
#define COMP_SUB_100mV                    ((uint32_t)COMP_CTRL_CMPVOS_0)
#define COMP_SUB_200mV                    ((uint32_t)COMP_CTRL_CMPVOS_1)
#define COMP_SUB_300mV                    ((uint32_t)(COMP_CTRL_CMPVOS_0 | COMP_CTRL_CMPVOS_1))

/** COMP non inverting input definition **/
#define COMP_INPSEL_MASK                  ((uint32_t)(~COMP_CTRL_INPSEL))
#define COMP_INPSEL_RES                   ((uint32_t)0x00000000) 
 /** comp inp sel **/  
#define COMP_INPSEL_PB0                  ((uint32_t)0x00000000)
#define COMP_INPSEL_PA5                  ((uint32_t)0x00000004)

/** COMP inverting input definition **/
#define COMP_INMSEL_MASK                  ((uint32_t)(~COMP_CTRL_INMSEL))
#define COMP_INMSEL_RES                   ((uint32_t)0x00000000)
/** comp inm sel **/
#define COMP_INMSEL_PB1                  ((uint32_t)0x00000000)
#define COMP_INMSEL_PA4                  ((uint32_t)0x00000002)

/** COMP output connection definition **/
#define COMP_OUTSEL_MASK                  ((uint32_t)(~COMP_CTRL_OUTTRG))
#define COMP_OUTSEL_RES                   ((uint32_t)0x00000000)
/** comp out trig **/
#define COMP_OUTSEL_NO                   ((uint32_t)0x00000000)
#define COMP_OUTSEL_TIM1_BKIN            ((uint32_t)0x00000080)
#define COMP_OUTSEL_TIM1_IC1             ((uint32_t)0x00000100)
#define COMP_OUTSEL_TIM1_OCREFCLEAR      ((uint32_t)0x00000180)
#define COMP_OUTSEL_TIM3_IC1             ((uint32_t)0x00000200)
#define COMP_OUTSEL_TIM3_OCREFCLEAR      ((uint32_t)0x00000280)

/** COMP switch definition **/
#define COMP_ENABLE                       ((uint32_t)COMP_CTRL_EN)
#define COMP_DISABLE                      ((uint32_t)(~COMP_CTRL_EN))

/** COMP filter definition **/
#define COMP_FILTER_SAMPW_MASK            ((uint16_t)(~COMP_FILC_SAMPW)) /* Low filter sample window size. Number of samples to monitor is SAMPWIN+1. */
#define COMP_FILTER_THRESHOLD_MASK        ((uint16_t)(~COMP_FILC_THRESH)) /* For proper operation, the value of THRESHOLD must be greater than SAMPWIN / 2. */

#define COMP_FILTER_ENABLE                ((uint16_t)COMP_FILC_FILEN) /* Filter enable. */
#define COMP_FILTER_DISABLE               ((uint16_t)(~COMP_FILC_FILEN)) /* Filter disable. */ 

/** COMP filter prescale definition **/
#define COMP_FILTER_CLKPSC_MASK           ((uint16_t)(~COMP_FILP_CLKPSC)) /* Low filter sample clock prescale.Number of system clocks between samples = CLK_PRE_CYCLE + 1, e.g. */

/** COMP lock definition**/
#define COMP_LOCK_MSK                    ((uint16_t)(~COMP_LOCK_CMPLK)) /* COMP Lock bit */
#define COMP_LOCK                    	 ((uint16_t)COMP_LOCK_CMPLK) /* COMP Lock bit */

/** COMP interrupt enable definition **/
#define COMP_INTEN_MSK                    ((uint16_t)(~COMP_INTEN_CMPIEN))      
#define COMP_INTEN                        ((uint16_t)COMP_INTEN_CMPIEN) /* This bit control Interrput enable of COMP. */   

/** COMP interrupt status clear definition **/ 
#define COMP_INTS_CLEAR		              ((uint32_t)(~COMP_INTSTS_CMPIS))

/** COMP output status definition**/
#define COMP_OUT_MASK                     	  ((uint32_t)(~COMP_CTRL_OUT)) 
#define COMP_OUT                     	  	  ((uint32_t)COMP_CTRL_OUT) 

/** COMP Driving Functions Declaration **/
void COMP_Reset(void);

void COMP_Initializes_Structure(COMP_InitType* COMP_initstruct);
void COMP_Filter_SampWindow_Config(uint8_t sampwin_value);
void COMP_Filter_Threshold_Config(uint8_t Threshold_value);
void COMP_Filter_Enable(void);
void COMP_Filter_Disable(void);
void COMP_Filter_Clock_Prescale_Config(uint16_t clkpsc_value);
void COMP_Blking_Soucre_Config(uint32_t blking_mode);
void COMP_Hysteresis_Level_Config(uint32_t hyst_mode);
void COMP_Output_Polarity_Config(uint32_t output_pol);
void COMP_InpSel_Config(uint32_t vpsel);
void COMP_InmSel_Config(uint32_t vpsel);
void COMP_Subtract_Level_Config(uint32_t sub_mode);
void COMP_Output_Trigger_Config(uint32_t outtrgsel);

void COMP_ON(void);
void COMP_OFF(void);

void COMP_Lock_Config(void);
void COMP_Interrupt_Enable(uint32_t inten);
void COMP_Interrupt_Disable(uint32_t inten);
uint8_t COMP_Interrupt_Status_Get(void);
void COMP_Interrupt_Status_Clear(void);

FlagStatus COMP_Output_Status_Get(void);

void COMP_Filter_Control_Config(uint32_t sw, uint8_t threshold , uint8_t sampwindow);

void COMP_Initializes(COMP_InitType* COMP_initstruct);

#ifdef __cplusplus
}
#endif

#endif /* __N32A003_COMP_H */

