/**************************************************************************************************/
/* LOW VOLTAGE LOAD SWITCHER BOARD																  */
/* Copyright 2012 MBARI.                                                    					  */
/* MBARI Proprietary Information. All rights reserved.                      					  */
/* FILENAME:		relay.c																  		  */
/* DESCRIPTION:		This file contains functions relating to the operation of the				  */
/*					board's latching relays.																  */
/* FUNCTION LIST:	relayOn(int channel)														  */
/*					relayOff(int channel)														  */
/*					relayState(int channel)														  */
/**************************************************************************************************/
#include <p24fxxxx.h>
#include <stdio.h>

#include "dig_io.h"
#include "sys_defs.h"
#include "spi2.h"
#include "expander.h"
#include "actions.h"
#include "relay.h"
#include "sys_timer.h"

////////////////////////////////////////////////////////////////////////////////////////////////////
//	NAME:			relayOff(int channel)
//	DESCRIPTION:	Turns off the relay on channel n. 		
////////////////////////////////////////////////////////////////////////////////////////////////////
void relayOff(int channel)
{
	switch(channel)
	{
		case 1:
		{
			//TURN RELAY_01 OFF
			expSetLow(DIO_01_CS, GPIOB, GP0);	//MAKE SURE RELAY_01_ON IS LOW
			tmrDelayMs(20);						//minimum latching time
			expSetHigh(DIO_01_CS, GPIOB, GP1);	//SET RELAY_01_OFF HIGH
			tmrDelayMs(20);						//minimum latching time
			break;
		}
		case 2:
		{
			//TURN RELAY_02 OFF
			expSetLow(DIO_01_CS, GPIOA, GP0);	//MAKE SURE RELAY_02_ON IS LOW
			tmrDelayMs(20);						//minimum latching time
			expSetHigh(DIO_01_CS, GPIOA, GP1);	//SET RELAY_02_OFF HIGH
			tmrDelayMs(20);						//minimum latching time
			break;
		}

	}
}

////////////////////////////////////////////////////////////////////////////////////////////////////
//	NAME:			relayOn(int channel)
//	DESCRIPTION:	Turns on the relay on channel n. 		
////////////////////////////////////////////////////////////////////////////////////////////////////
void relayOn(int channel)
{
	switch(channel)
	{
		case 1:
		{
			//TURN RELAY_01 ON
			expSetLow(DIO_01_CS, GPIOB, GP1);	//MAKE SURE RELAY_01_OFF IS LOW
			tmrDelayMs(20);						//minimum latching time
			expSetHigh(DIO_01_CS, GPIOB, GP0);	//SET RELAY_01_ON HIGH
			tmrDelayMs(20);						//minimum latching time
			break;
		}
		case 2:
		{
			//TURN RELAY_02 ON
			expSetLow(DIO_01_CS, GPIOA, GP1);	//MAKE SURE RELAY_02_OFF IS LOW
			tmrDelayMs(20);						//minimum latching time
			expSetHigh(DIO_01_CS, GPIOA, GP0);	//SET RELAY_02_ON HIGH
			tmrDelayMs(20);						//minimum latching time
			break;
		}
		default:
		{
			//TURN ALL OFF
			expSetLow(DIO_01_CS, GPIOA, GP0);	//RELAY_02_OFF IS LOW
			tmrDelayMs(20);						//minimum latching time
			expSetLow(DIO_01_CS, GPIOB, GP0);	//RELAY_01_OFF IS LOW
			tmrDelayMs(20);						//minimum latching time
			expSetLow(DIO_01_CS, GPIOA, GP1);	//RELAY_02_ON IS LOW
			tmrDelayMs(20);						//minimum latching time
			expSetLow(DIO_01_CS, GPIOB, GP1);	//RELAY_01_ON IS LOW
			tmrDelayMs(20);						//minimum latching time
			break;
		}
	}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
//	NAME:			relayState(int channel)
//	DESCRIPTION:	Checks the state of the relay on channel n. 
//	NOTES:			Returns true if relay is latched on, false if relay is latched off.		
////////////////////////////////////////////////////////////////////////////////////////////////////
int relayState(int channel)
{
	int state;
	
	switch(channel)
	{
		case 1:
		{
			state = expReadBit(DIO_01_CS, GPIOB, GP2);		//READ RELAY_01_STATE
			break;
		}
		case 2:
		{
			state = expReadBit(DIO_01_CS, GPIOA, GP2);		//READ RELAY_02_STATE
		}
	}

	return state;
}
