/**
 * @file AD_touch.h
 *
 */

#ifndef AD_TOUCH_H
#define AD_TOUCH_H

#ifdef __cplusplus
extern "C" {
#endif

/*********************
 *      INCLUDES
 *********************/
#ifndef LV_DRV_NO_CONF
#ifdef LV_CONF_INCLUDE_SIMPLE
#include "lv_drv_conf.h"
#else
#include "../../lv_drv_conf.h"
#endif
#endif

#if USE_AD_TOUCH

#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif

#define  _SUPPRESS_PLIB_WARNING
#include <plib.h>

#include "GenericTypeDefs.h"

#define DISP_ORIENTATION    0
#define DISP_HOR_RESOLUTION 320
#define DISP_VER_RESOLUTION 240

/*GetMaxX Macro*/
#if (DISP_ORIENTATION == 90) || (DISP_ORIENTATION == 270)
#define GetMaxX()   (DISP_VER_RESOLUTION - 1)
#elif (DISP_ORIENTATION == 0) || (DISP_ORIENTATION == 180)
#define GetMaxX()   (DISP_HOR_RESOLUTION - 1)
#endif

/*GetMaxY Macro*/
#if (DISP_ORIENTATION == 90) || (DISP_ORIENTATION == 270)
#define GetMaxY()   (DISP_HOR_RESOLUTION - 1)
#elif (DISP_ORIENTATION == 0) || (DISP_ORIENTATION == 180)
#define GetMaxY()   (DISP_VER_RESOLUTION - 1)
#endif

/*********************************************************************
 * HARDWARE PROFILE FOR THE RESISTIVE TOUCHSCREEN
 *********************************************************************/

#define TOUCH_ADC_INPUT_SEL AD1CHS

// ADC Sample Start
#define TOUCH_ADC_START AD1CON1bits.SAMP

// ADC Status
#define TOUCH_ADC_DONE AD1CON1bits.DONE

#define RESISTIVETOUCH_ANALOG 1
#define RESISTIVETOUCH_DIGITAL 0

// ADC channel constants
#define ADC_XPOS ADC_CH0_POS_SAMPLEA_AN12
#define ADC_YPOS ADC_CH0_POS_SAMPLEA_AN13

// ADC Port Control Bits
#define ADPCFG_XPOS AD1PCFGbits.PCFG12 //XR
#define ADPCFG_YPOS AD1PCFGbits.PCFG13 //YD

// X port definitions
#define ResistiveTouchScreen_XPlus_Drive_High()     LATBbits.LATB12 = 1
#define ResistiveTouchScreen_XPlus_Drive_Low()      LATBbits.LATB12 = 0         //LAT_XPOS
#define ResistiveTouchScreen_XPlus_Config_As_Input()    TRISBbits.TRISB12 = 1 //TRIS_XPOS
#define ResistiveTouchScreen_XPlus_Config_As_Output()   TRISBbits.TRISB12 = 0

#define ResistiveTouchScreen_XMinus_Drive_High()    LATFbits.LATF0 = 1
#define ResistiveTouchScreen_XMinus_Drive_Low()     LATFbits.LATF0 = 0         //LAT_XNEG
#define ResistiveTouchScreen_XMinus_Config_As_Input()   TRISFbits.TRISF0 = 1 //TRIS_XNEG
#define ResistiveTouchScreen_XMinus_Config_As_Output()  TRISFbits.TRISF0 = 0

// Y port definitions
#define ResistiveTouchScreen_YPlus_Drive_High() LATBbits.LATB13 = 1
#define ResistiveTouchScreen_YPlus_Drive_Low()  LATBbits.LATB13 = 0         //LAT_YPOS
#define ResistiveTouchScreen_YPlus_Config_As_Input()    TRISBbits.TRISB13 = 1 //TRIS_YPOS
#define ResistiveTouchScreen_YPlus_Config_As_Output()   TRISBbits.TRISB13 = 0

#define ResistiveTouchScreen_YMinus_Drive_High() LATFbits.LATF1 = 1
#define ResistiveTouchScreen_YMinus_Drive_Low()     LATFbits.LATF1 = 0         //LAT_YNEG
#define ResistiveTouchScreen_YMinus_Config_As_Input()   TRISFbits.TRISF1 = 1 //TRIS_YNEG
#define ResistiveTouchScreen_YMinus_Config_As_Output()  TRISFbits.TRISF1 = 0

// Default calibration points
#define TOUCHCAL_ULX 0x0348
#define TOUCHCAL_ULY 0x00CC
#define TOUCHCAL_URX 0x00D2
#define TOUCHCAL_URY 0x00CE
#define TOUCHCAL_LLX 0x034D
#define TOUCHCAL_LLY 0x0335
#define TOUCHCAL_LRX 0x00D6
#define TOUCHCAL_LRY 0x032D

void ad_touch_init(void);
bool ad_touch_read(lv_indev_data_t *data);
int16_t ad_touch_handler(void);

#endif /* USE_AD_TOUCH */

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* AD_TOUCH_H */
