/**************************************************************************************************/
/* LOW VOLTAGE LOAD SWITCHER BOARD																  */
/* Copyright 2012 MBARI.                                                    					  */
/* MBARI Proprietary Information. All rights reserved.                      					  */
/* FILENAME:		adcnew.c																	  */
/* DESCRIPTION:		This file contains functions relating to the operation of the				  */
/*					board's external, 16-bit analog to digital converters.						  */
/* FUNCTION LIST:	adcRead(int channel, int quantity)											  */
/*																								  */
/**************************************************************************************************/
#include <p24fxxxx.h>
#include <stdio.h>

#include "dig_io.h"
#include "sys_defs.h"
#include "spi2.h"
#include "expander.h"
#include "actions.h"
#include "adcnew.h"
#include "sys_timer.h"

////////////////////////////////////////////////////////////////////////////////////////////////////
//	NAME:			adcRead(int quantity)
//	DESCRIPTION:	Reads a 16-bit value from the analog to digital converter. 	
//	NOTES:			ADC_02, ADC_03 and ADC_04 do not yet exist on current board.
////////////////////////////////////////////////////////////////////////////////////////////////////

int adcRead(int quantity)
{
	int value, adcChan, ctrl_byte, dataL, dataH, dummy = 0;
	
	// DECIDE WHICH CHANNEL TO LOOK AT ON THE ADC
	// Note: this looks at the ADC's channels, not the board's channels, which are 
	// defined differently
	switch(quantity)
	{
		case 1:{
		}
		case 5:{
		}
		case 9:{
		}
		case 13:{
			adcChan = ADC_CON_A0;
			break;
		}
		case 2:{
		}
		case 6:{
		}
		case 10:{
		}
		case 14:{
			adcChan = ADC_CON_A2|ADC_CON_A0;
			break;
		}
		case 3:{
		}
		case 7:{
		}
		case 11:{
		}
		case 15:{
			adcChan = ADC_CON_A1;
			break;
		}
		case 4:{
		}
		case 8:{
		}
		case 12:{
		}
		case 16:{
			adcChan = ADC_CON_A2|ADC_CON_A1;
			break;
		}
	}

//	printf("adcChan: %d\r\n", adcChan);

	// CREATE CONTROL BYTE
	ctrl_byte = ADC_CON_S|adcChan|ADC_CON_SGLDIF|ADC_CON_PD1|ADC_CON_PD0;

	// SET CHIP SELECT LINES
	// Based on which ADC is associated with each quantity
	switch(quantity)
	{
		case 1:{
		}
		case 2:{
		}
		case 3:{
		}
		case 4:{
			CSAddSet(ADC_01_CS);
			break;
		}
		case 5:{
		}
		case 6:{
		}
		case 7:{
		}
		case 8:{
			CSAddSet(ADC_02_CS);		//***does not yet exist on board***
			break;
		}
		case 9:{
		}
		case 10:{
		}
		case 11:{
		}
		case 12:{
			CSAddSet(ADC_03_CS);		//***does not yet exist on board***
			break;
		}
		case 13:{
		}
		case 14:{
		}
		case 15:{
		}
		case 16:{
			CSAddSet(ADC_04_CS);		//***does not yet exist on board***
			break;
		}
	}

	// SEND CONTROL BYTE, THEN RECIEVE DATA
	dummy = ReadWriteSPI2(ctrl_byte);
	dataH = ReadWriteSPI2(0x00);
	dataL = ReadWriteSPI2(0x00);
	
	// DESELECT ADC
	CSAddSet(DESELECT);

	// SHIFT BITS AND COMBINE MSB AND LSB
	dataH = dataH << 8;
	value = dataH|dataL;

	// SEND BACK VALUE OF ADC
	return value;
}

