/********************************************/
/*Interrupts                                */
/*PIC32MX795F512L-80I/PF                    */
/********************************************/

#include <xc.h>

#include <sys/attribs.h>
#include "Interrupts.h"
#include "UART.h"
#include "LED_Port.h"
#include "Delay.h"
#include "Screens.h"
#include "SST39LF010.h"
#include "REN71V30.h"
#include "HX8357B.h"

void Interrupts_Init(void)
{
    //Set the interrupt controller for multi-vector mode
    INTCONSET = _INTCON_MVEC_MASK; 
        
    /*************************************/
    /*Priorities                         */
    /*************************************/
    //Set RTC interrupt priority to 7
    IPC8bits.RTCCIP = 7;

    //Set UART1 interrupt priority to 7  
    IPC6bits.U1IP = 7;
    //IPC6bits.U1AIS = 0;
    
    //Set Timer 2 Interrupt Priority to 7
    IPC2bits.T2IP = 7;
    //IPC2bits.T2IS = 1;
    
    //Set Timer 3 Interrupt Priority to 7
    IPC3bits.T3IP = 7;
    
    //Set Timer 4 Interrupt Priority to 7
    IPC4bits.T4IP = 7;
    
     //Set INT1 Interrupt Priority to 7
    IPC1bits.INT1IP = 7;
    
     //Set INT2 Interrupt Priority to 7
    IPC2bits.INT2IP = 7;
    
    /*************************************/
    /*Externals                          */
    /*************************************/
    
    //Set INT1 edge
    INTCONbits.INT1EP = 0;
    IFS0bits.INT1IF = 0;
   
    //Set INT2 edge
    INTCONbits.INT2EP = 0;
    IFS0bits.INT2IF = 0;
    
    return;
}

//This is the /INTR from the SRAM
void __ISR(7, IPL7SRS) INT1_Srvc(void)
{
    LED_Port(0x40);
    
    REN71V30_RD(0x3ff);
    
    IFS0bits.INT1IF = 0;
}   

//This is the /BUSYR from the SRAM
void __ISR(11, IPL7SRS) INT2_Srvc(void)
{
    LED_Port(0x80);
    IFS0bits.INT2IF = 0;
}

void __ISR(35, IPL7SRS) RTCC_Srvc(void)
{
    LED_Port(0x88);
    if(scrn_cnt == 1)
    {
        //HX8357B_DISPOFF();
        //Backlight_Control(10);
        //scrn_cnt = 0;
    }
    
    IFS1bits.RTCCIF = 0;
}

void __ISR(24, IPL7SRS) UART_RX_Srvc(void)
{
    //PORTAbits.RA7 = 0;
    if(U1STAbits.OERR == 1)
    {
        U1STAbits.OERR = 0;
    }
    
    ///////////////////////////////
    //XMODEM Protocol
    ///////////////////////////////
    //0 = idle, 1 = downloading, 2 = done
    xfr_status = 1;
    RX_Data[mcount] = U1RXREG;
    if(RX_Data[0] == 1)
    {
        LED_Port(pkt_count);
        
        mcount++;

        if(mcount >= 132)
        {
            //write to flash
            for(mcount=3;mcount<131;mcount++)
            {
                SST39LF010_WR(dcount, RX_Data[mcount]);
                dcount++;
            }
            pkt_count++;
            mcount = 0;
            //send ACK
            U1TXREG = 0x06;
        }
    }    
    
    if(RX_Data[0] == 4)
    {
        //send ACK
        U1TXREG = 0x06;
        //0 = idle, 1 = downloading, 2 = done
        xfr_status = 2;
        
        //get number of used bytes
        unsigned d = PMADDR;
        SST39LF010_Get_Bytes_Used();
        PMADDR = d;
    }

    IFS0bits.U1RXIF = 0;
    
    //PORTAbits.RA7 = 1;
}   

void __ISR(8, IPL7SRS) Timer2_Srvc(void)
{
    TMR2 = 0;
    
    IFS0bits.T2IF = 0;
}   

void __ISR(12, IPL7SRS) Timer3_Srvc(void)
{
    TMR3 = 0;
    
    IFS0bits.T3IF = 0;
}   

void __ISR(16, IPL7SRS) Timer4_Srvc(void)
{
    int dly_time = 5000;
  ///////////////////////////////////////////////
 //      X AXIS                              //
/////////////////////////////////////////////
    //RG12 drives, RB3 sinks, RG14 open
//PORTAbits.RA7 = 0;
    TRISGbits.TRISG14 = 1; //XL- 95
    
    AD1PCFGbits.PCFG3 = 1;          
    TRISBbits.TRISB3 = 0;
    PORTBbits.RB3 = 0; // YU+ 22
    
    TRISGbits.TRISG12 = 0;
    PORTGbits.RG12 = 1; //YD- 96 
    
    TRISBbits.TRISB2 = 1;
    //ADC reads the voltage on pin #23 (AN2)
    AD1PCFGbits.PCFG2 = 0;          //RB2/AN2 XR+ 
    AD1CHSbits.CH0SA = 2;           //Channel 0 positive input is AN2
    //wait for ADC
    Delay(dly_time);
    
    /**************************************************************************/
    IFS1bits.AD1IF = 0;             //Clear interrupt flag
//PORTAbits.RA7 = 0;
    AD1CON1bits.ASAM = 1;           //Auto start sampling for 31 TAD, then convert   

    while(!IFS1bits.AD1IF);         //Wait for conversion to complete
    AD1CON1bits.ASAM = 0;           //Stop sample/convert

    data_x = ADC1BUF0;
//PORTAbits.RA7 = 1; 
    data_x = (data_x - 67) / 1.780;
    if(data_x >= 480)
    {
        data_x = 480;
    }
/**************************************************************************/
  
  ///////////////////////////////////////////////
 //      Y AXIS                              //
/////////////////////////////////////////////
    //RG14 drives, RB2 sinks, RG12 open
    TRISGbits.TRISG12 = 1; //YD- 96
    
    TRISGbits.TRISG14 = 0;
    PORTGbits.RG14 = 1; //XL- 95
    
    AD1PCFGbits.PCFG2 = 1; 
    
    TRISBbits.TRISB2 = 0; 
    PORTBbits.RB2 = 0;  //XR+ 23
    //ADC reads the voltage on pin #22
    AD1PCFGbits.PCFG3 = 0; //RB3/AN3 YU+ 22
    TRISBbits.TRISB3 = 1;
    AD1CHSbits.CH0SA = 3; //Channel 0 positive input is AN3
    //wait for ADC
    Delay(dly_time);
    
    IFS1bits.AD1IF = 0;             //Clear interrupt flag
PORTAbits.RA7 = 0;
    AD1CON1bits.ASAM = 1;           //Auto start sampling for 31 TAD, then convert    
    while(!IFS1bits.AD1IF);         //Wait for conversion to complete
    AD1CON1bits.ASAM = 0;           //Stop sample/convert
PORTAbits.RA7 = 1;    
    data_y = ADC1BUF0;

    data_y = (data_y - 95) / 2.463;

    if(data_y >= 320)
    {
        data_y = 320;
    }
    
  ///////////////////////////////////////////////
 //      I Sense                              //
/////////////////////////////////////////////
    AD1CHSbits.CH0SA = 9;           //Channel 0 positive input is AN9
    
    Delay(dly_time);
    
    AD1CON1bits.ADON = 1;
    
    ADC1BUF0 = 0;
    IFS1bits.AD1IF = 0;             //Clear interrupt flag
    AD1CON1bits.ASAM = 1;           //Auto start sampling for 31 TAD, then convert
    while(!IFS1bits.AD1IF);         //Wait for conversion to complete
    AD1CON1bits.ASAM = 0;           //Stop sample/convert
    
    data_i = ADC1BUF0;              //Read the buffer
    data_i = data_i / 1.364;
    
    TMR4 = 0;
    
    IFS0bits.T4IF = 0;
    
    
    //PORTAbits.RA7 = 1;
}   

