/********************************************/
/*Display Touch Code                        */
/*                                          */
/*PIC32MX795F512L-80I/PF                    */
/********************************************/

#include "xc.h"
#include "Touch.h"
#include "HX8357B.h"
#include "Binary2ASCIIBCD.h"

void Get_x(void)
{
  //////////////////////////////////////////////
 //      X AXIS                              //
/////////////////////////////////////////////
    TRISGbits.TRISG12 = 0;
    TRISBbits.TRISB3 = 0;
    TRISBbits.TRISB2 = 1;    
    TRISGbits.TRISG14 = 1;
    
    //select channel
    AD1CSSLbits.CSSL2 = 1;          //AN2
    
    //ADC reads the voltage on pin #23
    
    //RG12 drives, RB3 sinks, RG14 open
    PORTGbits.RG12 = 1; //YD- 96    
    PORTGbits.RG14 = 0; //XL- 95
    PORTBbits.RB3 = 0; // YU+ 22
    //       ADC on RB2 = XR+ 23
    
    AD1CHSbits.CH0SA = 2;               //AN2 = positive input
    AD1CHSbits.CH0NA = 0;               //VREFL = negative input
    
    AD1CON1bits.SAMP = 1;
    
    while (AD1CON1bits.DONE == 0);
    AD1CON1bits.ASAM = 0;

    data_x = ADC1BUF0;

    fore_color = 0x103f;
    back_color = 0x0c64;

    Binary2ASCIIBCD(data_x);
    
    //X-
    WriteChar(340, 1, '(', fore_color);

    //Hundreds
    WriteChar(355, 1, d2, fore_color);

    //Tens
    WriteChar(370, 1, d1, fore_color);

    //Ones
    WriteChar(385, 1, d0, fore_color);

    WriteChar(400, 1, ',', fore_color);
    
    //Deselect channel
    AD1CSSLbits.CSSL2 = 0;          //AN2
    
    return;
}

void Get_y(void)
{
////////////////////////////////////////////////
//      Y AXIS                              //
/////////////////////////////////////////////
    TRISGbits.TRISG12 = 1;
    TRISBbits.TRISB3 = 1;
    TRISBbits.TRISB2 = 0;    
    TRISGbits.TRISG14 = 0;
    
    //select channel
    AD1CSSLbits.CSSL3 = 1;          //AN3
    
    //ADC reads the voltage on pin #22
    
    //RG14 drives, RB2 sinks, RG12 open
    PORTGbits.RG12 = 0; //YD- 96    
    PORTGbits.RG14 = 1; //XL- 95
    //      ADC on RB3  //YU+ 22
    PORTBbits.RB2 = 0;  //XR+ 23
   
    //select channel
    AD1CHSbits.CH0SA = 3;               //AN3 = positive input
    AD1CHSbits.CH0NA = 0;               //VREFL = negative input
            
    AD1CON1bits.SAMP = 1;
    
    while (AD1CON1bits.DONE == 0);
    AD1CON1bits.ASAM = 0;

    data_y = ADC1BUF0;
    
    Binary2ASCIIBCD(data_y);
    
    fore_color = 0x103f;
    back_color = 0x0c64;

    //Y-
    //Hundreds
    WriteChar(415, 1, d2, fore_color);

    //Tens
    WriteChar(430, 1, d1, fore_color);

    //Ones
    WriteChar(445, 1, d0, fore_color);

    WriteChar(460, 1, ')', fore_color);
     
    //Deselect channel
    AD1CSSLbits.CSSL3 = 0;          //AN3
        
   return;
}


void TouchDev(void)
{
    int i;
  //////////////////////////////////////////////
 //      X AXIS                              //
/////////////////////////////////////////////
    TRISGbits.TRISG12 = 0;
    TRISBbits.TRISB3 = 0;
    TRISBbits.TRISB2 = 1;    
    TRISGbits.TRISG14 = 1;
    
    //ADC reads the voltage on pin #23
    
    //RG12 drives, RB3 sinks, RG14 open
    PORTGbits.RG12 = 1; //YD- 96    
    PORTGbits.RG14 = 0; //XL- 95
    PORTBbits.RB3 = 0; // YU+ 22
    //       ADC on RB2 = XR+ 23
    
    AD1CHSbits.CH0SA = 2;               //AN2 = positive input
    AD1CHSbits.CH0NA = 0;               //VREFL = negative input
    
    for(i=0;i<=500;i++)
    {
        //LED_Write(2);
    }
            
    //clear data
    ADC1BUF0 = 0;
    ADC1BUF1 = 0;
    ADC1BUF2 = 0;

    //auto start sampling
    AD1CON1bits.ASAM = 1;
    
    while (IFS1bits.AD1IF == 0)
    {
        //LED_Write(3);
    }
    //stop sampling and convert
    AD1CON1bits.ASAM = 0;    
    //LED_Write(4);
    data_x = (ADC1BUF0 + ADC1BUF1 + ADC1BUF2)/3;
    IFS1bits.AD1IF = 0;

    fore_color = 0x103f;
    back_color = 0xffff;

    Binary2ASCIIBCD(data_x);
    
    //X-
    WriteChar(30, 50, '(', fore_color);

    //Hundreds
    WriteChar(45, 50, d2, fore_color);

    //Tens
    WriteChar(60, 50, d1, fore_color);

    //Ones
    WriteChar(75, 50, d0, fore_color);

    WriteChar(90, 50, ',', fore_color);

////////////////////////////////////////////////
//      Y AXIS                              //
/////////////////////////////////////////////
    TRISGbits.TRISG12 = 1;
    TRISBbits.TRISB3 = 1;
    TRISBbits.TRISB2 = 0;    
    TRISGbits.TRISG14 = 0;
    
    //ADC reads the voltage on pin #22
    
    //RG14 drives, RB2 sinks, RG12 open
    PORTGbits.RG12 = 0; //YD- 96    
    PORTGbits.RG14 = 1; //XL- 95
    //      ADC on RB3  //YU+ 22
    PORTBbits.RB2 = 0;  //XR+ 23
   
    AD1CHSbits.CH0SA = 3;               //AN3 = positive input
    AD1CHSbits.CH0NA = 0;               //VREFL = negative input
    
    for(i=0;i<=500;i++)
    {
        //LED_Write(0x20);
    }
            
    //clear data
    ADC1BUF0 = 0;
    ADC1BUF1 = 0;
    ADC1BUF2 = 0;

    //auto start sampling
    AD1CON1bits.ASAM = 1;
    
    while (IFS1bits.AD1IF == 0)
    {
        //LED_Write(0x30);
    }
    //stop sampling and convert
    AD1CON1bits.ASAM = 0;    
    //LED_Write(0x40);
    data_y = (ADC1BUF0 + ADC1BUF1 + ADC1BUF2)/3;
    IFS1bits.AD1IF = 0;

    fore_color = 0x103f;
    back_color = 0xffff;

    Binary2ASCIIBCD(data_y);
    
    //Y-
    //Hundreds
    WriteChar(105, 50, d2, fore_color);

    //Tens
    WriteChar(120, 50, d1, fore_color);

    //Ones
    WriteChar(135, 50, d0, fore_color);

    WriteChar(150, 50, ')', fore_color);
    
    back_color = 0xa0c2;

    //Draw pixels
    if(data_x < 122)
    {
        data_x = 122;
    }
    data_x = (data_x - 122) / 1.725;
    
    if(data_y < 142)
    {
        data_y = 142;
    }
    data_y = (data_y - 142)/2.43;
    
    HX8357B_CASET(data_x, data_x + 1);    
    HX8357B_RASET(data_y, data_y + 1);
            
    HX8357B_RAMWR();
            
    //Select Display (/CS)    
    PORTDbits.RD11 = 0;
            
    for(i=0;i<=25; i++)
    {
        PMDIN = ~back_color;
        while(PMMODEbits.BUSY == 1);
    }
    
    //Select Display (/CS)    
    PORTDbits.RD11 = 1;
            
    return;
}
