#pragma once

#include "vtvsub.h"

//##########################################################################
//####################    Subsystem::SubsystemResource    ##################
//##########################################################################

struct VTVPower__SubsystemResource:
	public Subsystem::SubsystemResource
{
	Scalar
		maxAcceleration;
};

//##########################################################################
//############################    VTVPower    ##############################
//##########################################################################

class VTVPower:
	public Subsystem
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Shared Data support
//
public:
	static Derivation *GetClassDerivations();
	static SharedData DefaultData;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Message Support
//
#if 0
private:
	static const HandlerEntry MessageHandlerEntries[];

protected:
	static MessageHandlerSet MessageHandlers;
#endif

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Attribute Support
//
public:
	enum {
		MaxAccelerationOutputAttributeID = Subsystem::NextAttributeID,
		NextAttributeID
	};

private:
	static const IndexEntry AttributePointers[];

protected:
	//static AttributeIndexSet AttributeIndex
	static AttributeIndexSet& GetAttributeIndex();

//
// public attribute declarations go here
//
public:
	Scalar
		maxAccelerationOutput;

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

	void
		PowerSimulation(Scalar time_slice);

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

	VTV*
		GetEntity()
			{Check(this); return Cast_Object(VTV*, Subsystem::GetEntity());}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Construction and Destruction
//
public:
	typedef VTVPower__SubsystemResource SubsystemResource;

	VTVPower(
		VTV *owner,
     int subsystem_ID,
		SubsystemResource *subsystem
	);
	~VTVPower();

	Logical
  	TestInstance() const;
};
