/***************************************************************************
 *   Copyright (C) 2006 by Miguel Armando Riem de Oliveira   *
 *   mike@BlackBandit   *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

#include <camera1394_control.h>


int camera1394_control::GetBrightness(void)
{
	dc1394_get_brightness(handle, numnodes[nodenum], &captureparams.Brightness);
	if (flg.verbose) cout << "Brightness=" << captureparams.Brightness << endl;
	return captureparams.Brightness;
};

int camera1394_control::GetExposure(void)
{
	dc1394_get_exposure(handle, numnodes[nodenum], &captureparams.Exposure);
	if (flg.verbose) cout << "Exposure=" << captureparams.Exposure << endl;
	return captureparams.Exposure;
};

int camera1394_control::GetSharpness(void)
{
	dc1394_get_sharpness(handle, numnodes[nodenum], &captureparams.Sharpness);
	if (flg.verbose) cout << "Sharpness=" << captureparams.Sharpness << endl;	
	return captureparams.Sharpness;
};

int camera1394_control::GetWhiteBalance(void)
{
	dc1394_get_white_balance(handle, numnodes[nodenum], &captureparams.WhiteBalance.u_b_value, &captureparams.WhiteBalance.v_r_value);
	if (flg.verbose) cout << "WhiteBalance [u_b ; v_r]= [" << captureparams.WhiteBalance.u_b_value << " ; " << captureparams.WhiteBalance.v_r_value << "]" << endl;
	return 1;
};

int camera1394_control::GetHue(void)
{
	dc1394_get_hue(handle, numnodes[nodenum], &captureparams.Hue);
	if (flg.verbose) cout << "Hue=" << captureparams.Hue << endl;
	return captureparams.Hue;
};

int camera1394_control::GetSaturation(void)
{
	dc1394_get_saturation(handle, numnodes[nodenum], &captureparams.Saturation);
	if (flg.verbose) cout << "Saturation=" << captureparams.Saturation << endl;
	return captureparams.Saturation;
};

int camera1394_control::GetGamma(void)
{
	dc1394_get_gamma(handle, numnodes[nodenum], &captureparams.Gamma);
	if (flg.verbose) cout << "Gamma=" << captureparams.Gamma << endl;
	return captureparams.Gamma;
};

int camera1394_control::GetShutter(void)
{
	dc1394_get_shutter(handle, numnodes[nodenum], &captureparams.Shutter);
	if (flg.verbose) cout << "Shutter=" << captureparams.Shutter << endl;
	return captureparams.Shutter;
};

int camera1394_control::GetGain(void)
{
	dc1394_get_gain(handle, numnodes[nodenum], &captureparams.Gain);
	if (flg.verbose) cout << "Gain=" << captureparams.Gain << endl;
	return captureparams.Gain;
};


int camera1394_control::GetFrameRate(void)
{
	dc1394_get_frame_rate(handle, numnodes[nodenum], &captureparams.FrameRate);
	if (flg.verbose) cout << "FrameRate=" << captureparams.FrameRate << endl;
	return captureparams.FrameRate;
};


int camera1394_control::GetIris(void)
{
	dc1394_get_iris(handle, numnodes[nodenum],&captureparams.Iris);
	if (flg.verbose) cout << "Iris=" << captureparams.Iris << endl;
	return captureparams.Iris;
};



int camera1394_control::SetBrightness(unsigned int b)
{
	captureparams.Brightness=b; 
	if (flg.verbose)
	{
		cout << "Brightness set to " << captureparams.Brightness << "... OK"<< endl;
		cout << "Changing brightness to manual control " << endl;
	}
	dc1394_auto_on_off(handle, numnodes[nodenum], FEATURE_BRIGHTNESS, 0);
	return dc1394_set_brightness(handle, numnodes[nodenum], captureparams.Brightness);
};

int camera1394_control::SetSaturation(unsigned int s)
{
	captureparams.Saturation=s;
	if (flg.verbose)
	{
		cout << "Changing Saturation to manual control " << endl;
		cout << "Saturation set to " << captureparams.Saturation << "... OK"<< endl;
	}
	dc1394_auto_on_off(handle, numnodes[nodenum], FEATURE_SATURATION, 0);
	return dc1394_set_saturation(handle, numnodes[nodenum], captureparams.Saturation);
};

int camera1394_control::SetFrameRate(int fr)
{
	switch (fr)
	{
		case FRAMERATE_3_75:
		{	
			captureparams.framerate=FRAMERATE_3_75;
			if (flg.verbose)
			{
				printf("Frame rate FRAMERATE_3_75 set...OK\n");
			}
			break;
		}
		case FRAMERATE_7_5:
		{	
			captureparams.framerate=FRAMERATE_7_5;
			if (flg.verbose)
			{
				printf("Frame rate FRAMERATE_7_5 set...OK\n");
			}
			break;
		}
		case FRAMERATE_15:
		{	
			captureparams.framerate=FRAMERATE_15;
			if (flg.verbose)
			{
				printf("Frame rate FRAMERATE_15 set...OK\n");
			}
			break;
		}
		case FRAMERATE_30:
		{	
			captureparams.framerate=FRAMERATE_30;
			if (flg.verbose)
			{
				printf("Frame rate FRAMERATE_30 set...OK\n");
			}
			break;
		}
		case FRAMERATE_60:
		{	
			captureparams.framerate=FRAMERATE_60;
			if (flg.verbose)
			{
				printf("Frame rate FRAMERATE_60 set...OK\n");
			}
			break;
		}
		default:
		{	
			if (flg.verbose)
			{
				printf("Frame rate unknown.\n");
				PrintPossibleFrameRates();
				printf("Using default frame rate FRAMERATE_30.\n");
				printf("Check dc1394_control.h for aditional info...ERROR\n");
			}
			captureparams.framerate=FRAMERATE_30;
			break;
		}
	}
	return dc1394_set_frame_rate(handle, numnodes[nodenum], captureparams.framerate);

	
};

int camera1394_control::SetExposure(unsigned int e)
{
	captureparams.Exposure=e;
	if (flg.verbose)
	{
		cout << "Changing Exposure to manual control " << endl;
		cout << "Exposure set to " << captureparams.Exposure << "... OK"<< endl;
	}
	dc1394_auto_on_off(handle, numnodes[nodenum], FEATURE_EXPOSURE, 0);
	return dc1394_set_exposure(handle, numnodes[nodenum], captureparams.Exposure);
};

int camera1394_control::SetSharpness(unsigned int s)
{
	captureparams.Sharpness=s;
	if (flg.verbose)
	{
		cout << "Changing Sharpness to manual control " << endl;
		cout << "Sharpness set to " << captureparams.Sharpness << "... OK"<< endl;
	}
	dc1394_auto_on_off(handle, numnodes[nodenum], FEATURE_SHARPNESS, MANUAL);
	return dc1394_set_sharpness(handle, numnodes[nodenum], captureparams.Sharpness);
};

int camera1394_control::SetWhiteBalance(unsigned int ub, unsigned int vr)
{
	captureparams.WhiteBalance.u_b_value=ub;
	captureparams.WhiteBalance.v_r_value=vr;
	if (flg.verbose)
	{
		cout << "Changing WhiteBalance to manual control " << endl;
		cout << "WhiteBalance set to [" << captureparams.WhiteBalance.u_b_value << " , " << captureparams.WhiteBalance.v_r_value << "]... OK"<< endl;
	}
	dc1394_auto_on_off(handle, numnodes[nodenum], FEATURE_WHITE_BALANCE, 0);
	return dc1394_set_white_balance(handle, numnodes[nodenum], captureparams.WhiteBalance.u_b_value, captureparams.WhiteBalance.v_r_value);
};

int camera1394_control::SetHue(unsigned int h)
{
	captureparams.Hue=h;
	if (flg.verbose)
	{
		cout << "Changing Hue to manual control " << endl;
		cout << "Hue set to " << captureparams.Hue << "... OK"<< endl;
	}
	dc1394_auto_on_off(handle, numnodes[nodenum], FEATURE_HUE, 0);
	return dc1394_set_hue(handle, numnodes[nodenum], captureparams.Hue);
};

int camera1394_control::SetGamma(unsigned int g)
{
	captureparams.Gamma=g;
	if (flg.verbose)
	{
		cout << "Changing Gamma to manual control " << endl;
		cout << "Gamma set to " << captureparams.Gamma << "... OK"<< endl;
	}
	dc1394_auto_on_off(handle, numnodes[nodenum], FEATURE_GAMMA, 0);
	return dc1394_set_gamma(handle, numnodes[nodenum], captureparams.Gamma);
};

int camera1394_control::SetShutter(unsigned int s)
{
	captureparams.Shutter=s;
	if (flg.verbose)
	{
		cout << "Changing Shutter to manual control " << endl;
		cout << "Shutter set to " << captureparams.Shutter << "... OK"<< endl;
	}
	dc1394_auto_on_off(handle, numnodes[nodenum], FEATURE_SHUTTER, 0);
	return dc1394_set_shutter(handle, numnodes[nodenum], captureparams.Shutter);
};

int camera1394_control::SetGain(unsigned int g)
{
	captureparams.Gain=g;
	if (flg.verbose)
	{
		cout << "Changing Gain to manual control " << endl;
		cout << "Gain set to " << captureparams.Gain << "... OK"<< endl;
	}
	dc1394_auto_on_off(handle, numnodes[nodenum], FEATURE_GAIN, 0);
	return dc1394_set_gain(handle, numnodes[nodenum], captureparams.Gain);
};



