#pragma once

#include "..\munga\controls.h"
#include "..\munga\cammppr.h"

//##########################################################################
//####################         CameraL4Mapper           #######################
//##########################################################################
class CameraL4Mapper :
	public CameraControlsMapper
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Shared Data Support
//
public:
	static Derivation *GetClassDerivations();
	static SharedData DefaultData;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Messaging Support
//
public:
	void
		KeypressMessageHandler(ReceiverDataMessageOf<ControlsKey> *message);

protected:
	static const HandlerEntry
		MessageHandlerEntries[];
	static MessageHandlerSet
		MessageHandlers;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Model Support
//
public:
	typedef void
		(CameraL4Mapper::*Performance)(Scalar time_slice);

	void
		InterpretControls(Scalar time_slice);

	void
		SetPerformance(Performance performance)
			{
				Check(this);
				activePerformance = (Simulation::Performance)performance;
			}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Construction and Destruction Support
//
public:
	CameraL4Mapper(
		CameraShip *owner,
		int subsystem_ID,
		SubsystemResource *subsystem_resource,
		SharedData &shared_data = DefaultData
	);
	~CameraL4Mapper();

	Logical
		TestInstance() const;

protected:
	ControlsScalar
		leftPedal,
		rightPedal;
};

//##########################################################################
//####################    CameraThrustmasterMapper   #######################
//##########################################################################

class CameraThrustmasterMapper :
	public CameraL4Mapper
{

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Shared Data Support
//
public:
	static Derivation *GetClassDerivations();
	static SharedData DefaultData;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Model Support
//
public:
	typedef void
		(CameraThrustmasterMapper::*Performance)(Scalar time_slice);

	void
		InterpretControls(Scalar time_slice);

	void
		SetPerformance(Performance performance)
			{
				Check(this);
				activePerformance = (Simulation::Performance)performance;
			}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Construction and Destruction Support
//
public:
	CameraThrustmasterMapper(
		CameraShip *owner,
		int subsystem_ID,
		SubsystemResource *subsystem_resource,
		SharedData &shared_data = DefaultData
	);
	~CameraThrustmasterMapper();

	Logical
		TestInstance() const;

protected:
	ControlsButton
		throttleUp,
		throttleDown;
};

//##########################################################################
//###########################    CameraRIOMapper    ########################
//##########################################################################

class CameraRIOMapper :
	public CameraL4Mapper
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Shared Data Support
//
public:
	static Derivation *GetClassDerivations();
	static SharedData DefaultData;

 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Construction and Destruction Support
//
public:
	CameraRIOMapper(
		CameraShip *owner,
		int subsystem_ID,
		SubsystemResource *subsystem_resource,
		SharedData &shared_data = DefaultData
	);
	~CameraRIOMapper();

	Logical
		TestInstance() const;
};
