
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

#include "fasterAnalogRead.h"

extern unsigned char analog_reference;

fastAnalog::fastAnalog()
{
}

fastAnalog::~fastAnalog()
{
}

void fastAnalog::SetPrescaler(unsigned char val)
{
	int idx=0;
	while (val>1)
	{
		idx++;
		val>>=1;
	}
	if (idx & 0x01)
	    sbi(ADCSRA,ADPS0);
	else
	    cbi(ADCSRA,ADPS0);
	if (idx & 0x02)
	    sbi(ADCSRA,ADPS1);
	else
	    cbi(ADCSRA,ADPS1);
	if (idx & 0x04)
	    sbi(ADCSRA,ADPS2);
	else
	    cbi(ADCSRA,ADPS2);
    /*sbi(ADCSRA,ADPS2);    // 1 0 0 := /16  1 0 1 := /32  1 1 0 := /64  1 1 1 := /128
    sbi(ADCSRA,ADPS1);
    cbi(ADCSRA,ADPS0);
    */
}

void fastAnalog::startNextAnalogVal()
{
    // start new conversion
    unsigned char pin=analogPins[curAnalogVal];
	
	#if defined(ADCSRB) && defined(MUX5)
	    ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
	#endif
	#if defined(ADMUX)
	    ADMUX = (analog_reference << 6) | (pin & 0x07);
	#endif
   sbi(ADCSRA,ADSC);
}

int fastAnalog::readLastAnalogVal(void)
{
    while (bit_is_set(ADCSRA, ADSC)) // wait for completion
    {
    }
    unsigned char low;
    low = ADCL;
    int val=(ADCH<<8) | low;
    analogVals[curAnalogVal]=val;
    isValid[curAnalogVal]=1;
    curAnalogVal++;
    if (curAnalogVal==MAXANALOGVALS)
        curAnalogVal=0;
    return val;
}
