/*********************************************************************
 *
 *              Header for Input Capture module library functions
 *
 *********************************************************************
 * FileName:        INCAP.H
 * Dependencies:	None
 * Processor:       PIC32
 *
 * Compiler:        MPLAB XC32
 * Company:         Microchip Technology Inc.
 *
 * Software License Agreement:
 *
 * The software supplied herewith by Microchip Technology Incorporated
 * (the “Company”) for its PICmicro® Microcontroller is intended and
 * supplied to you, the Company’s customer, for use solely and
 * exclusively on Microchip PICmicro Microcontroller products. The
 * software is owned by the Company and/or its supplier, and is
 * protected under applicable copyright laws. All rights are reserved.
 * Any use in violation of the foregoing restrictions may subject the
 * user to criminal sanctions under applicable laws, as well as to
 * civil liability for the breach of the terms and conditions of this
 * license.
 *
 * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES,
 * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
 * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
 * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
 *
 *
 * $Id $
 * $Name $
 *
 ********************************************************************/


#ifndef __INCAP_H__
#define __INCAP_H__

#include <xc.h>
#include <peripheral/int.h>

/*
*  WARNING: All the Peripheral Library (PLIB) functions, including those in this file,
*  will be removed from future releases of MPLAB XC32 C/C++ Compiler.
*  Please refer to the MPLAB Harmony Libraries for new projects.  For legacy support,
*  these PLIB Libraries will be available for download from: www.microchip.com/pic32_peripheral_lib
*/
#ifndef _SUPPRESS_PLIB_WARNING
  #warning The PLIB functions and macros in this file will be removed from the MPLAB XC32 C/C++ Compiler in future releases
#endif



/*********************************************************************
 * <combinewith OpenCapture2, OpenCapture3, OpenCapture4, OpenCapture5>
 *
 * Function:        OpenCapturex()
 *
 * Description:     Configures specified capture channel
 *
 * PreCondition:    None
 *
 * Inputs:          config - see below
 *
 * Output:          None
 *
 * Example:         OpenCapture1(IC_ON | IC_FEDGE_RISE | IC_TIMER2_SRC);
 *
 ********************************************************************/
#ifdef _ICAP1
	#define  OpenCapture1(config)		(IC1CON = (config))
#endif

#ifdef _ICAP2
	#define  OpenCapture2(config)		(IC2CON = (config))
#endif

#ifdef _ICAP3
	#define  OpenCapture3(config)		(IC3CON = (config))
#endif

#ifdef _ICAP4
	#define  OpenCapture4(config)		(IC4CON = (config))
#endif

#ifdef _ICAP5
	#define  OpenCapture5(config)		(IC5CON = (config))
#endif

	/******************************************************************************
	 * Available options for config parameter
	 *****************************************************************************/
		// Module On/off control - values are mutually exclusive
		#define IC_ON					(1 << _IC1CON_ON_POSITION)
		#define IC_OFF					0

		// Module Stop-In-Idle control - values are mutually exclusive
		#define IC_IDLE_CON             (1 << _IC1CON_SIDL_POSITION)  	/* IC operates in sleep mode */
		#define IC_IDLE_STOP            0  								/* IC stop in sleep mode */

		// First Edge control - values are mutually exclusive
		#define IC_FEDGE_RISE			(1 << _IC1CON_FEDGE_POSITION)	/* Capture Rising Edge First */
		#define IC_FEDGE_FALL			0								/* Capture Falling Edge First */

		// 16- or 32-bit - values are mutually exclusive
		#define IC_CAP_32BIT			(1 << _IC1CON_C32_POSITION)		/* 32-bit timer resource capture */
		#define IC_CAP_16BIT			0								/* 16-bit timer resource capture */

		// Timer select - values are mutually exclusive
		#define IC_TIMER3_SRC    (0)                                    /* Timer 3 is the clock source for Capture */
        #define IC_TIMER2_SRC    (1 << _IC1CON_ICTMR_POSITION)          /* Timer2 is the clock source for Capture */


		// Capture interrupt control - values are mutually exclusive
		#define IC_INT_4CAPTURE         (3 << _IC1CON_ICI0_POSITION)  	/* Interrupt on fourth Capture*/
		#define IC_INT_3CAPTURE         (2 << _IC1CON_ICI0_POSITION)	/* Interrupt on third Capture */
		#define IC_INT_2CAPTURE         (1 << _IC1CON_ICI0_POSITION)	/* Interrupt on second Capture*/
		#define IC_INT_1CAPTURE         (0 << _IC1CON_ICI0_POSITION)	/* Interrupt on first Capture */

		// Mode select - values are mutually exclusive
		#define IC_INTERRUPT            (7 << _IC1CON_ICM_POSITION)		/* Interrupt pin only in CPU sleep and idle mode */
		#define IC_SP_EVERY_EDGE   		(6 << _IC1CON_ICM_POSITION)  	/* Specified edge first, then every rising/falling edge */
		#define IC_EVERY_16_RISE_EDGE   (5 << _IC1CON_ICM_POSITION)  	/* Every 16th rising edge */
		#define IC_EVERY_4_RISE_EDGE    (4 << _IC1CON_ICM_POSITION)  	/* Every 4th rising edge  */
		#define IC_EVERY_RISE_EDGE      (3 << _IC1CON_ICM_POSITION)  	/* Every rising edge      */
		#define IC_EVERY_FALL_EDGE      (2 << _IC1CON_ICM_POSITION)  	/* Every falling edge      */
		#define IC_EVERY_EDGE           (1 << _IC1CON_ICM_POSITION)  	/* Every rising/falling edge */
		#define IC_INPUTCAP_OFF         (0)  							/* Input Capture Off      */
	/***********************************
	 * End config parameter values
	 ************************************/


/*********************************************************************
 * <combinewith ConfigIntCapture2, ConfigIntCapture3, ConfigIntCapture4, ConfigIntCapture5>
 *
 * Function:        ConfigIntCapturex(unsigned int)
 *
 * Description:     Configures specified capture channel
 *
 * PreCondition:    None
 *
 * Inputs:          config - see below
 *
 * Output:          None
 *
 * Example:         ConfigIntCapture1(IC_INT_ON | IC_INT_PRIOR_4 | IC_INT_SUB_PRIOR_3);
 *
 ********************************************************************/
#ifdef _ICAP1
	#define ConfigIntCapture1(config) (mIC1ClearIntFlag(), mIC1SetIntPriority((config)&7), mIC1SetIntSubPriority(((config)&3)>>3), mIC1IntEnable((config)>>15))
#endif

#ifdef _ICAP2
	#define ConfigIntCapture2(config) (mIC2ClearIntFlag(), mIC2SetIntPriority((config)&7), mIC2SetIntSubPriority(((config)&3)>>3), mIC2IntEnable((config)>>15))
#endif

#ifdef _ICAP3
	#define ConfigIntCapture3(config) (mIC3ClearIntFlag(), mIC3SetIntPriority((config)&7), mIC3SetIntSubPriority(((config)&3)>>3), mIC3IntEnable((config)>>15))
#endif

#ifdef _ICAP4
	#define ConfigIntCapture4(config) (mIC4ClearIntFlag(), mIC4SetIntPriority((config)&7), mIC4SetIntSubPriority(((config)&3)>>3), mIC4IntEnable((config)>>15))
#endif

#ifdef _ICAP5
	#define ConfigIntCapture5(config) (mIC5ClearIntFlag(), mIC5SetIntPriority((config)&7), mIC5SetIntSubPriority(((config)&3)>>3), mIC5IntEnable((config)>>15))
#endif


	/******************************************************************************
	 * Available options for config parameter
	 *****************************************************************************/
		// Interrupt enable/disable - values are mutually exclusive
		#define IC_INT_ON               (1<<15)  	/* Input Capture Int Enable  */
		#define IC_INT_OFF              (0)			/* Input Capture Int Disable */

		// Interrupt priority values - values are mutually exclusive
		#define IC_INT_PRIOR_0          (0)
		#define IC_INT_PRIOR_1          (1)
		#define IC_INT_PRIOR_2          (2)
		#define IC_INT_PRIOR_3          (3)
		#define IC_INT_PRIOR_4          (4)
		#define IC_INT_PRIOR_5          (5)
		#define IC_INT_PRIOR_6          (6)
		#define IC_INT_PRIOR_7          (7)

		// Interrupt sub-priority values - values are mutually exclusive
		#define IC_INT_SUB_PRIOR_0      (0<<3)
		#define IC_INT_SUB_PRIOR_1      (1<<3)
		#define IC_INT_SUB_PRIOR_2      (2<<3)
		#define IC_INT_SUB_PRIOR_3      (3<<3)
	/***********************************
	 * End config parameter values
	 ************************************/


/*********************************************************************
 * <combinewith SetPriorityIntIC2, SetPriorityIntIC3, SetPriorityIntIC4, SetPriorityIntIC5>
 *
 * Function:        SetPriorityIntICx(priority)
 *
 * Description:     Sets priority and sub-priority for specified capture channel
 *
 * PreCondition:    None
 *
 * Inputs:          config - see below
 *
 * Output:          None
 *
 * Example:         SetPriorityIntIC1(IC_INT_PRIOR_4 | IC_INT_SUB_PRIOR_3);
 *
 ********************************************************************/
#ifdef _ICAP1
	#define SetPriorityIntIC1(priority)     (mIC1SetIntPriority((priority)&7), mIC1SetIntSubPriority(((priority)&3)>>3))
#endif

#ifdef _ICAP2
	#define SetPriorityIntIC2(priority)     (mIC2SetIntPriority((priority)&7), mIC2SetIntSubPriority(((priority)&3)>>3))
#endif

#ifdef _ICAP3
	#define SetPriorityIntIC3(priority)     (mIC3SetIntPriority((priority)&7), mIC3SetIntSubPriority(((priority)&3)>>3))
#endif

#ifdef _ICAP4
	#define SetPriorityIntIC4(priority)     (mIC4SetIntPriority((priority)&7), mIC4SetIntSubPriority(((priority)&3)>>3))
#endif

#ifdef _ICAP5
	#define SetPriorityIntIC5(priority)     (mIC5SetIntPriority((priority)&7), mIC5SetIntSubPriority(((priority)&3)>>3))
#endif


	/******************************************************************************
	 * Available options for config parameter
	 *****************************************************************************/
		// Interrupt priority values - values are mutually exclusive
		// Use same options from ConfigIntCapturex macro

		// Interrupt sub-priority values - values are mutually exclusive
		// Use same options from ConfigIntCapturex macro
	/***********************************
	 * End config parameter values
	 ************************************/



/*********************************************************************
 * <combinewith DisableIntIC1, EnableIntIC2, DisableIntIC2, EnableIntIC3, DisableIntIC3, EnableIntIC4, DisableIntIC4, EnableIntIC5, DisableIntIC5>
 *
 * Function:        void EnableIntICx
 *					void DisableIntICx
 *
 * Description:     Enables/Disables interrupt for specified capture channel
 *
 * PreCondition:    None
 *
 * Inputs:          None
 *
 * Output:          None
 *
 * Example:         EnableIntIC1;
 *
 ********************************************************************/
#ifdef _ICAP1
	#define EnableIntIC1                    mIC1IntEnable(1)
	#define DisableIntIC1                   mIC1IntEnable(0)
#endif

#ifdef _ICAP2
	#define EnableIntIC2                    mIC2IntEnable(1)
	#define DisableIntIC2                   mIC2IntEnable(0)
#endif

#ifdef _ICAP3
	#define EnableIntIC3                    mIC3IntEnable(1)
	#define DisableIntIC3                   mIC3IntEnable(0)
#endif

#ifdef _ICAP4
	#define EnableIntIC4                    mIC4IntEnable(1)
	#define DisableIntIC4                   mIC4IntEnable(0)
#endif

#ifdef _ICAP5
	#define EnableIntIC5                    mIC5IntEnable(1)
	#define DisableIntIC5                   mIC5IntEnable(0)
#endif


/*********************************************************************
 * <combinewith  CloseCapture2, CloseCapture3, CloseCapture4, CloseCapture5>
 *
 * Function:        void CloseCapturex(void)
 *
 * Description:     Closes specified capture channel
 *
 * PreCondition:    None
 *
 * Inputs:          None
 *
 * Output:          None
 *
 * Example:         CloseCapture1();
 *
 ********************************************************************/
#ifdef _ICAP1
	#define CloseCapture1()	(mIC1IntEnable(0), mIC1ClearIntFlag(), IC1CONCLR = _IC1CON_ICM_MASK)
#endif

#ifdef _ICAP2
	#define CloseCapture2()	(mIC2IntEnable(0), mIC2ClearIntFlag(), IC2CONCLR = _IC2CON_ICM_MASK)
#endif

#ifdef _ICAP3
	#define CloseCapture3()	(mIC3IntEnable(0), mIC3ClearIntFlag(), IC3CONCLR = _IC3CON_ICM_MASK)
#endif

#ifdef _ICAP4
	#define CloseCapture4()	(mIC4IntEnable(0), mIC4ClearIntFlag(), IC4CONCLR = _IC4CON_ICM_MASK)
#endif

#ifdef _ICAP5
	#define CloseCapture5()	(mIC5IntEnable(0), mIC5ClearIntFlag(), IC5CONCLR = _IC5CON_ICM_MASK)
#endif


/*********************************************************************
 * <combinewith  ReadCapture2, ReadCapture3, ReadCapture4, ReadCapture5>
 *
 * Function:        void ReadCapture1x(void)
 *
 * Description:     Reads specified capture channel, waits if data is not ready
 *
 * PreCondition:    None
 *
 * Inputs:          None
 *
 * Output:          None
 *
 * Example:         ReadCapture11();
 *
 ********************************************************************/
#ifdef _ICAP1
	void ReadCapture1(unsigned int * buffer);
#endif

#ifdef _ICAP2
	void ReadCapture2(unsigned int * buffer);
#endif

#ifdef _ICAP3
	void ReadCapture3(unsigned int * buffer);
#endif

#ifdef _ICAP4
	void ReadCapture4(unsigned int * buffer);
#endif

#ifdef _ICAP5
	void ReadCapture5(unsigned int * buffer);
#endif


/*********************************************************************
 * <combinewith  mIC2CaptureReady, mIC3CaptureReady, mIC4CaptureReady, mIC5CaptureReady>
 *
 * Function:        int mICxCaptureReady(void)
 *
 * Description:     Checks to see if specified channel has captured anything
 *
 * PreCondition:    None
 *
 * Inputs:          None
 *
 * Output:          '1' if there is a captured data
 *					'0' otherwise
 *
 * Example:         if ( mIC1CaptureReady1() )
 *						// There is some data
 *					else
 *						// There is no data
 *
 ********************************************************************/
#ifdef _ICAP1
	#define mIC1CaptureReady()				(IC1CONbits.ICBNE)
#endif

#ifdef _ICAP2
	#define mIC2CaptureReady()				(IC2CONbits.ICBNE)
#endif

#ifdef _ICAP3
	#define mIC3CaptureReady()				(IC3CONbits.ICBNE)
#endif

#ifdef _ICAP4
	#define mIC4CaptureReady()				(IC4CONbits.ICBNE)
#endif

#ifdef _ICAP5
	#define mIC5CaptureReady()				(IC5CONbits.ICBNE)
#endif


/*********************************************************************
 * <combinewith  mIC2ReadCapture, mIC3ReadCapture, mIC4ReadCapture, mIC5ReadCapture>
 *
 * Function:        int mIC1ReadCapture(void)
 *
 * Description:     Reads the captured data
 *
 * PreCondition:    mIC1CaptureReady() must be '1'
 *
 * Inputs:          None
 *
 * Output:          Captured data
 *
 * Example:         if ( mIC1CaptureReady1() )
 *						// There is some data
 *						myData = mIC1ReadCapture();
 *					else
 *						// There is no data
 *
 ********************************************************************/
#ifdef _ICAP1
	#define mIC1ReadCapture()				(IC1BUF)
#endif

#ifdef _ICAP2
	#define mIC2ReadCapture()				(IC2BUF)
#endif

#ifdef _ICAP3
	#define mIC3ReadCapture()				(IC3BUF)
#endif

#ifdef _ICAP4
	#define mIC4ReadCapture()				(IC4BUF)
#endif

#ifdef _ICAP5
	#define mIC5ReadCapture()				(IC5BUF)
#endif


#endif  /*__INCAP_H__  */


