/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2008. All Rights Reserved.							  */
/* Open Source Software - may be modified and shared by FRC teams. The code   */
/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib.  */
/*----------------------------------------------------------------------------*/

#ifndef __AXIS_CAMERA_PARAMS_H__
#define __AXIS_CAMERA_PARAMS_H__

#include "EnumCameraParameter.h"
#include "ErrorBase.h"
#include "IntCameraParameter.h"
#include "Task.h"
#include <vector>

/**
 * AxisCameraParams class.
 * This class handles parameter configuration the Axis 206 Ethernet Camera.
 * It starts up a tasks with an independent connection to the camera that monitors
 * for changes to parameters and updates the camera.
 * It is only separate from AxisCamera to isolate the parameter code from the image streaming code.
 */
class AxisCameraParams: public ErrorBase
{
public:
	typedef enum Exposure_t {kExposure_Automatic, kExposure_Hold, kExposure_FlickerFree50Hz, kExposure_FlickerFree60Hz};
	typedef enum WhiteBalance_t {kWhiteBalance_Automatic, kWhiteBalance_Hold, kWhiteBalance_FixedOutdoor1, kWhiteBalance_FixedOutdoor2, kWhiteBalance_FixedIndoor, kWhiteBalance_FixedFlourescent1, kWhiteBalance_FixedFlourescent2};
	typedef enum Resolution_t {kResolution_640x480, kResolution_640x360, kResolution_320x240, kResolution_160x120};
	typedef enum Rotation_t {kRotation_0, kRotation_180};

protected:
	AxisCameraParams(const char* ipAddress);
	virtual ~AxisCameraParams();

public:
	// Mid-stream gets & writes
	void WriteBrightness(int);
	int GetBrightness();
	void WriteWhiteBalance(WhiteBalance_t whiteBalance);
	WhiteBalance_t GetWhiteBalance();
	void WriteColorLevel(int);
	int GetColorLevel();
	void WriteExposureControl(Exposure_t);
	Exposure_t GetExposureControl();
	void WriteExposurePriority(int);
	int GetExposurePriority();
	void WriteMaxFPS(int);
	int GetMaxFPS();

	// New-Stream gets & writes (i.e. require restart)
	void WriteResolution(Resolution_t);
	Resolution_t GetResolution();
	void WriteCompression(int);
	int GetCompression();
	void WriteRotation(Rotation_t);
	Rotation_t GetRotation();

protected:
	virtual void RestartCameraTask() = 0;
	int CreateCameraSocket(const char *requestString);

	static int s_ParamTaskFunction(AxisCameraParams* thisPtr);
	int ParamTaskFunction();

	int UpdateCamParam(const char *param);
	int ReadCamParams();

	Task m_paramTask;
	UINT32 m_ipAddress; // IPv4
	SEM_ID m_paramChangedSem;

	//Camera Properties
	IntCameraParameter *m_brightnessParam;
	IntCameraParameter *m_compressionParam;
	IntCameraParameter *m_exposurePriorityParam;
	IntCameraParameter *m_colorLevelParam;
	IntCameraParameter *m_maxFPSParam;
	EnumCameraParameter *m_rotationParam;
	EnumCameraParameter *m_resolutionParam;
	EnumCameraParameter *m_exposureControlParam;
	EnumCameraParameter *m_whiteBalanceParam;

	// A vector to access all properties simply.
	typedef std::vector<IntCameraParameter*> ParameterVector_t;
	ParameterVector_t m_parameters;
};


#endif
