/*************************************************************************
 * (c) Copyright 2009 Actel Corporation.  All rights reserved.
 *
 *  Application demo for Fusion
 *
 *
 * Author : Actel Application Team
 * Rev     : 1.0.0.3
 *
 **************************************************************************/

/**************************************************************************/
/* Standard Includes */
/**************************************************************************/

#include <stdio.h>
#include <stdlib.h>

/**************************************************************************/
/* Driver Includes */
/**************************************************************************/

#include "coreai.h"
#include "platform.h"

/**************************************************************************/
/* RTOS Includes */
/**************************************************************************/

#include "FreeRTOS.h"
#include "semphr.h"

/**************************************************************************/
/* Global Declarations */
/**************************************************************************/

float                     real_voltage_value;
float                     real_current_value;
float                     real_temperature_value_tc;
float                     real_temperature_value_tk;
float                     real_temperature_value_tf;


/*  ADC configured for 12-bit mode. */
#define ADC_RESOLUTION  0xFFF

void display_voltage
(
    uint8_t channel_nb,
    uint16_t raw_value
)
{
    uint32_t full_scale;
    float current_AC4;

    /* Translate from raw ADC value to mV. */
    full_scale = CAI_input_full_range( channel_nb );
    real_voltage_value = (float)((full_scale * raw_value) / ADC_RESOLUTION)/(float)1000;
	current_AC4 = ((real_voltage_value * 5000 )/((real_voltage_value * 5000 )+ (3.3 * 2000))) * (3.3/5000);
	real_current_value = 0.66 - (current_AC4 * 1000);
}

/***************************************************************************//**
 *
 */
void display_temperature
(
    uint8_t channel_nb,
    uint16_t raw_value
)
{
	real_temperature_value_tc = (float)((raw_value / 4 ) - 273);
}

void process_samples( uint16_t *adc_samples )
{
    uint8_t channel_nb;

    for ( channel_nb = ADC_CHAN_VCC; channel_nb < ADC_NB_OF_CHANNELS; channel_nb++ )
    {
        if ( (adc_samples[channel_nb] != UNUSED_CHANNEL) && (adc_samples[channel_nb] != SAMPLED_CHANNEL) )
        {
            uint16_t raw_value;

            raw_value = adc_samples[channel_nb];

            if ( CAI_is_temperature( channel_nb ) )
            {
                display_temperature( channel_nb, raw_value );
            }
            else
            {
                display_voltage( channel_nb, raw_value );
            }

        }
    }
}


/****************************************************************/
/* Creating ACE task for free RTOS */
/****************************************************************/

void ace_task(void *para)
{
    static uint16_t adc_samples[ADC_NB_OF_CHANNELS] =
    {
        UNUSED_CHANNEL,    /* ADC_CHAN_VCC */

        UNUSED_CHANNEL,    /* ADC_CHAN_AV0 */
        UNUSED_CHANNEL,    /* ADC_CHAN_AC0 */
        UNUSED_CHANNEL,    /* ADC_CHAN_AT0 */

        UNUSED_CHANNEL,    /* ADC_CHAN_AV1 */
        UNUSED_CHANNEL,    /* ADC_CHAN_AC1 */
        UNUSED_CHANNEL,    /* ADC_CHAN_AT1 */

        UNUSED_CHANNEL,    /* ADC_CHAN_AV2 */
        UNUSED_CHANNEL,    /* ADC_CHAN_AC2 */
        SAMPLED_CHANNEL,     /* ADC_CHAN_AT2 */

        UNUSED_CHANNEL,    /* ADC_CHAN_AV3 */
        UNUSED_CHANNEL,    /* ADC_CHAN_AC3 */
        UNUSED_CHANNEL,     /* ADC_CHAN_AT3 */

        UNUSED_CHANNEL,    /* ADC_CHAN_AV4 */
        SAMPLED_CHANNEL,    /* ADC_CHAN_AC4 */
        UNUSED_CHANNEL,    /* ADC_CHAN_AT4 */

        UNUSED_CHANNEL,    /* ADC_CHAN_AV5 */
        UNUSED_CHANNEL,    /* ADC_CHAN_AC5 */
        UNUSED_CHANNEL,    /* ADC_CHAN_AT5 */

        UNUSED_CHANNEL,    /* ADC_CHAN_AV6 */
        UNUSED_CHANNEL,    /* ADC_CHAN_AC6 */
        UNUSED_CHANNEL,    /* ADC_CHAN_AT6 */

        UNUSED_CHANNEL,    /* ADC_CHAN_AV7 */
        UNUSED_CHANNEL,    /* ADC_CHAN_AC7 */
        UNUSED_CHANNEL,    /* ADC_CHAN_AT7 */

        UNUSED_CHANNEL,    /* ADC_CHAN_AV8 */
        UNUSED_CHANNEL,    /* ADC_CHAN_AC8 */
        UNUSED_CHANNEL,    /* ADC_CHAN_AT8 */

        UNUSED_CHANNEL,    /* ADC_CHAN_AV9 */
        UNUSED_CHANNEL,    /* ADC_CHAN_AC9 */
        UNUSED_CHANNEL,    /* ADC_CHAN_AT9 */

        SAMPLED_CHANNEL,    /* ADC_CHAN_INT_TEMP */
    };

    CAI_init( COREAI_BASE_ADDR );

    while( 1 )
    {
        CAI_round_robin( adc_samples );
        process_samples( adc_samples );
    }
}
