/*** HEADER *******************************************************************/
/*                                                                            */
/* File:                                                                      */
/* Author:                                                                    */
/*                                                                            */
/*** NOTES ********************************************************************/
/*                                                                            */
/*                                                                            */
/*                                                                            */
/*** Includes *****************************************************************/

#include <xc.h>
#include "adc.h"
#include "measurement.h"
#include "timer.h"
//#include "uart.h"
//#include "math.h"
//#include <stdlib.h>

/*** GLOBAL-VAR ***************************************************************/

int adc_buffer[MEASUREMENTS*8/CHANNELS]={0};
int adc_time[MEASUREMENTS/CHANNELS][1]={{0},{0}};
volatile int measurement_done;

/*** FUNCTIONS ****************************************************************/

void __attribute__((interrupt, auto_psv)) _ADCInterrupt(void)
{
    static unsigned int count=0;            // count samples
    static unsigned int flag=0;             // signal detection flag
    static unsigned int c_flag=0;           // counter to stop measurement if no signal is detected
    //unsigned int count_test=0;

    IFS0bits.ADIF=0;                        // reset unterrupt flag

    if(ADCON2bits.BUFS==1)                  // Buffer 0x0-0x7 is filled
    {
        adc_buffer[count++]=ADCBUF0;
        adc_buffer[count++]=ADCBUF1;
        adc_buffer[count++]=ADCBUF2;
        adc_buffer[count++]=ADCBUF3;
        adc_buffer[count++]=ADCBUF4;
        adc_buffer[count++]=ADCBUF5;
        adc_buffer[count++]=ADCBUF6;
        adc_buffer[count++]=ADCBUF7;
    }
    else if(ADCON2bits.BUFS==0)             // Buffer 0x8-0xF is filled
    {
        adc_buffer[count++]=ADCBUF8;
        adc_buffer[count++]=ADCBUF9;
        adc_buffer[count++]=ADCBUFA;
        adc_buffer[count++]=ADCBUFB;
        adc_buffer[count++]=ADCBUFC;
        adc_buffer[count++]=ADCBUFD;
        adc_buffer[count++]=ADCBUFE;
        adc_buffer[count++]=ADCBUFF;
    }

    if(flag < nMIN)                         // detect signal
    {
        for(count=0; count<8; count++)
        {
            if(adc_buffer[count] > MIN || -adc_buffer[count] > MIN){flag++;}
            c_flag++;
        }
        count=0;

        if(c_flag>=nMIN_TO_ABORT)           // Measurement aborted
        {
            measurement_done=0;	            // XXX
            ADCON1bits.ADON=0;              // ...stop the AD-Converter.
            flag=0;
            c_flag=0;
            count=0;
        }
    }

    
    if(count>=MEASUREMENTS*8/CHANNELS)      // All measurements done? Then...
    {
        measurement_done=1;		    // XXX
        ADCON1bits.ADON=0;                  // ...stop the AD-Converter.
        flag=0;
        c_flag=0;
        count=0;
        
    }

    //for(count_test=0; count_test<=95; count_test++){}     // 95 max.
    if(IFS0bits.ADIF==1){while(1){PORTDbits.RD1=1;}}
}

/******************************************************************************/
