
#define ADC_BUFFER_SIZE 7

static volatile unsigned char __adc_buffer[ADC_BUFFER_SIZE];
static volatile unsigned char __adc_buffer_ptr;

extern void InitAdcReader() {
    for ( __adc_buffer_ptr = 0;
          __adc_buffer_ptr < ADC_BUFFER_SIZE;
          __adc_buffer_ptr++ ) {
        __adc_buffer[__adc_buffer_ptr] = 0;
    }
    __adc_buffer_ptr = 0;
}

extern unsigned char  ReadAdc() {
    unsigned char  ix;
    unsigned short result;

    // Collect one ADC sample
    __adc_buffer[__adc_buffer_ptr] = ADC_DATA_PORT;

    // Advance the pointer
    __adc_buffer_ptr++;
    if (__adc_buffer_ptr >= ADC_BUFFER_SIZE ) {
        __adc_buffer_ptr = 0;
    }

    // Calculate average sum
    result = 0;
    for ( ix = 0; ix < ADC_BUFFER_SIZE; ix++ ) {
        result  += __adc_buffer[ix];
    }

    // Calculate the average
    result = result / (unsigned char)ADC_BUFFER_SIZE;

    return (unsigned char)(result & 0xFF);
}

