//////////////////////////////////////////////////////////////////////////////
//
// Asura_PlatformInput.h
//
// Copyright (c) 2006 Rebellion. All rights reserved.
//
//////////////////////////////////////////////////////////////////////////////

// B E G I N   F I L E   W R A P P E R ///////////////////////////////////////

#ifdef ASURA_USE_PRAGMA_ONCE
    #pragma once
#endif

#ifndef ___ASURA_PLATFORMINPUT_H___
#define ___ASURA_PLATFORMINPUT_H___ 1

// I N C L U D E S ///////////////////////////////////////////////////////////

// Engine independent.
#include "Core/Asura_UserInput.h"

// T Y P E S /////////////////////////////////////////////////////////////////

enum ASURA_PS3_PADBUTTONOFFSET
{
    ASURA_PS3_PADBUTTONOFFSET_CROSS,
    ASURA_PS3_PADBUTTONOFFSET_CIRCLE,
    ASURA_PS3_PADBUTTONOFFSET_SQUARE,
    ASURA_PS3_PADBUTTONOFFSET_TRIANGLE,
    ASURA_PS3_PADBUTTONOFFSET_R2,
    ASURA_PS3_PADBUTTONOFFSET_L2,
    ASURA_PS3_PADBUTTONOFFSET_START,
    ASURA_PS3_PADBUTTONOFFSET_SELECT,
    ASURA_PS3_PADBUTTONOFFSET_L1,
    ASURA_PS3_PADBUTTONOFFSET_R1,
    ASURA_PS3_PADBUTTONOFFSET_L3,
    ASURA_PS3_PADBUTTONOFFSET_R3,
    ASURA_PS3_PADBUTTONOFFSET_UP,
    ASURA_PS3_PADBUTTONOFFSET_DOWN,
    ASURA_PS3_PADBUTTONOFFSET_LEFT,
    ASURA_PS3_PADBUTTONOFFSET_RIGHT,

    ASURA_PS3_PADBUTTONOFFSET_NEXT_PAD,
};

enum ASURA_PS3_PADAXISOFFSET
{
    ASURA_PS3_PADAXISOFFSET_LSTICK_H,
    ASURA_PS3_PADAXISOFFSET_LSTICK_V,
    ASURA_PS3_PADAXISOFFSET_RSTICK_H,
    ASURA_PS3_PADAXISOFFSET_RSTICK_V,

    ASURA_PS3_PADAXISOFFSET_NEXT_PAD,
};

enum ASURA_PS3_PADSENSOROFFSET
{
    ASURA_PS3_PADSENSOROFFSET_AXIS_X,
    ASURA_PS3_PADSENSOROFFSET_AXIS_Y,
    ASURA_PS3_PADSENSOROFFSET_AXIS_Z,
    ASURA_PS3_PADSENSOROFFSET_GYRO_YAW,

	ASURA_PS3_PADSENSOROFFSET_SHAKE,
	ASURA_PS3_PADSENSOROFFSET_ROCKING_X,

    ASURA_PS3_PADSENSOROFFSET_NEXT_PAD,
};

enum ASURA_PS3_KEYID
{
    ASURA_PS3_KEYID_PAD1_CROSS    = ASURA_KEYID_PAD1_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_CROSS,
    ASURA_PS3_KEYID_PAD1_CIRCLE   = ASURA_KEYID_PAD1_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_CIRCLE,
    ASURA_PS3_KEYID_PAD1_SQUARE   = ASURA_KEYID_PAD1_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_SQUARE,
    ASURA_PS3_KEYID_PAD1_TRIANGLE = ASURA_KEYID_PAD1_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_TRIANGLE,
    ASURA_PS3_KEYID_PAD1_R2       = ASURA_KEYID_PAD1_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_R2,
    ASURA_PS3_KEYID_PAD1_L2       = ASURA_KEYID_PAD1_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_L2,
    ASURA_PS3_KEYID_PAD1_START    = ASURA_KEYID_PAD1_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_START,
    ASURA_PS3_KEYID_PAD1_SELECT   = ASURA_KEYID_PAD1_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_SELECT,
    ASURA_PS3_KEYID_PAD1_L1       = ASURA_KEYID_PAD1_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_L1,
    ASURA_PS3_KEYID_PAD1_R1       = ASURA_KEYID_PAD1_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_R1,
    ASURA_PS3_KEYID_PAD1_L3       = ASURA_KEYID_PAD1_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_L3,
    ASURA_PS3_KEYID_PAD1_R3       = ASURA_KEYID_PAD1_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_R3,
    ASURA_PS3_KEYID_PAD1_UP       = ASURA_KEYID_PAD1_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_UP,
    ASURA_PS3_KEYID_PAD1_DOWN     = ASURA_KEYID_PAD1_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_DOWN,
    ASURA_PS3_KEYID_PAD1_LEFT     = ASURA_KEYID_PAD1_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_LEFT,
    ASURA_PS3_KEYID_PAD1_RIGHT    = ASURA_KEYID_PAD1_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_RIGHT,
    
    ASURA_PS3_KEYID_PAD2_CROSS    = ASURA_KEYID_PAD2_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_CROSS,
    ASURA_PS3_KEYID_PAD2_CIRCLE   = ASURA_KEYID_PAD2_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_CIRCLE,
    ASURA_PS3_KEYID_PAD2_SQUARE   = ASURA_KEYID_PAD2_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_SQUARE,
    ASURA_PS3_KEYID_PAD2_TRIANGLE = ASURA_KEYID_PAD2_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_TRIANGLE,
    ASURA_PS3_KEYID_PAD2_R2       = ASURA_KEYID_PAD2_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_R2,
    ASURA_PS3_KEYID_PAD2_L2       = ASURA_KEYID_PAD2_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_L2,
    ASURA_PS3_KEYID_PAD2_START    = ASURA_KEYID_PAD2_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_START,
    ASURA_PS3_KEYID_PAD2_SELECT   = ASURA_KEYID_PAD2_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_SELECT,
    ASURA_PS3_KEYID_PAD2_L1       = ASURA_KEYID_PAD2_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_L1,
    ASURA_PS3_KEYID_PAD2_R1       = ASURA_KEYID_PAD2_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_R1,
    ASURA_PS3_KEYID_PAD2_L3       = ASURA_KEYID_PAD2_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_L3,
    ASURA_PS3_KEYID_PAD2_R3       = ASURA_KEYID_PAD2_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_R3,
    ASURA_PS3_KEYID_PAD2_UP       = ASURA_KEYID_PAD2_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_UP,
    ASURA_PS3_KEYID_PAD2_DOWN     = ASURA_KEYID_PAD2_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_DOWN,
    ASURA_PS3_KEYID_PAD2_LEFT     = ASURA_KEYID_PAD2_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_LEFT,
    ASURA_PS3_KEYID_PAD2_RIGHT    = ASURA_KEYID_PAD2_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_RIGHT,

    ASURA_PS3_KEYID_PAD3_CROSS    = ASURA_KEYID_PAD3_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_CROSS,
    ASURA_PS3_KEYID_PAD3_CIRCLE   = ASURA_KEYID_PAD3_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_CIRCLE,
    ASURA_PS3_KEYID_PAD3_SQUARE   = ASURA_KEYID_PAD3_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_SQUARE,
    ASURA_PS3_KEYID_PAD3_TRIANGLE = ASURA_KEYID_PAD3_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_TRIANGLE,
    ASURA_PS3_KEYID_PAD3_R2       = ASURA_KEYID_PAD3_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_R2,
    ASURA_PS3_KEYID_PAD3_L2       = ASURA_KEYID_PAD3_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_L2,
    ASURA_PS3_KEYID_PAD3_START    = ASURA_KEYID_PAD3_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_START,
    ASURA_PS3_KEYID_PAD3_SELECT   = ASURA_KEYID_PAD3_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_SELECT,
    ASURA_PS3_KEYID_PAD3_L1       = ASURA_KEYID_PAD3_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_L1,
    ASURA_PS3_KEYID_PAD3_R1       = ASURA_KEYID_PAD3_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_R1,
    ASURA_PS3_KEYID_PAD3_L3       = ASURA_KEYID_PAD3_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_L3,
    ASURA_PS3_KEYID_PAD3_R3       = ASURA_KEYID_PAD3_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_R3,
    ASURA_PS3_KEYID_PAD3_UP       = ASURA_KEYID_PAD3_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_UP,
    ASURA_PS3_KEYID_PAD3_DOWN     = ASURA_KEYID_PAD3_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_DOWN,
    ASURA_PS3_KEYID_PAD3_LEFT     = ASURA_KEYID_PAD3_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_LEFT,
    ASURA_PS3_KEYID_PAD3_RIGHT    = ASURA_KEYID_PAD3_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_RIGHT,

    ASURA_PS3_KEYID_PAD4_CROSS    = ASURA_KEYID_PAD4_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_CROSS,
    ASURA_PS3_KEYID_PAD4_CIRCLE   = ASURA_KEYID_PAD4_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_CIRCLE,
    ASURA_PS3_KEYID_PAD4_SQUARE   = ASURA_KEYID_PAD4_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_SQUARE,
    ASURA_PS3_KEYID_PAD4_TRIANGLE = ASURA_KEYID_PAD4_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_TRIANGLE,
    ASURA_PS3_KEYID_PAD4_R2       = ASURA_KEYID_PAD4_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_R2,
    ASURA_PS3_KEYID_PAD4_L2       = ASURA_KEYID_PAD4_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_L2,
    ASURA_PS3_KEYID_PAD4_START    = ASURA_KEYID_PAD4_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_START,
    ASURA_PS3_KEYID_PAD4_SELECT   = ASURA_KEYID_PAD4_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_SELECT,
    ASURA_PS3_KEYID_PAD4_L1       = ASURA_KEYID_PAD4_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_L1,
    ASURA_PS3_KEYID_PAD4_R1       = ASURA_KEYID_PAD4_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_R1,
    ASURA_PS3_KEYID_PAD4_L3       = ASURA_KEYID_PAD4_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_L3,
    ASURA_PS3_KEYID_PAD4_R3       = ASURA_KEYID_PAD4_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_R3,
    ASURA_PS3_KEYID_PAD4_UP       = ASURA_KEYID_PAD4_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_UP,
    ASURA_PS3_KEYID_PAD4_DOWN     = ASURA_KEYID_PAD4_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_DOWN,
    ASURA_PS3_KEYID_PAD4_LEFT     = ASURA_KEYID_PAD4_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_LEFT,
    ASURA_PS3_KEYID_PAD4_RIGHT    = ASURA_KEYID_PAD4_BUTTON1 + ASURA_PS3_PADBUTTONOFFSET_RIGHT,
};

enum ASURA_PS3_SENSORID
{
	ASURA_PS3_SENSORID_PAD1_AXIS_X,
	ASURA_PS3_SENSORID_PAD1_AXIS_Y, 
	ASURA_PS3_SENSORID_PAD1_AXIS_Z,
	ASURA_PS3_SENSORID_PAD1_GYRO_YAW,
	ASURA_PS3_SENSORID_PAD2_AXIS_X,
	ASURA_PS3_SENSORID_PAD2_AXIS_Y, 
	ASURA_PS3_SENSORID_PAD2_AXIS_Z,
	ASURA_PS3_SENSORID_PAD2_GYRO_YAW,
	ASURA_PS3_SENSORID_PAD3_AXIS_X,
	ASURA_PS3_SENSORID_PAD3_AXIS_Y, 
	ASURA_PS3_SENSORID_PAD3_AXIS_Z,
	ASURA_PS3_SENSORID_PAD3_GYRO_YAW,
	ASURA_PS3_SENSORID_PAD4_AXIS_X,
	ASURA_PS3_SENSORID_PAD4_AXIS_Y, 
	ASURA_PS3_SENSORID_PAD4_AXIS_Z,
	ASURA_PS3_SENSORID_PAD4_GYRO_YAW,
};

enum ASURA_PS3_OUTPUTID
{
	// Keys
    ASURA_PS3_KEYID_CROSS    = ASURA_PS3_PADBUTTONOFFSET_CROSS,
    ASURA_PS3_KEYID_CIRCLE   = ASURA_PS3_PADBUTTONOFFSET_CIRCLE,
    ASURA_PS3_KEYID_SQUARE   = ASURA_PS3_PADBUTTONOFFSET_SQUARE,
    ASURA_PS3_KEYID_TRIANGLE = ASURA_PS3_PADBUTTONOFFSET_TRIANGLE,
    ASURA_PS3_KEYID_R2       = ASURA_PS3_PADBUTTONOFFSET_R2,
    ASURA_PS3_KEYID_L2       = ASURA_PS3_PADBUTTONOFFSET_L2,
    ASURA_PS3_KEYID_START    = ASURA_PS3_PADBUTTONOFFSET_START,
    ASURA_PS3_KEYID_SELECT   = ASURA_PS3_PADBUTTONOFFSET_SELECT,
    ASURA_PS3_KEYID_L1       = ASURA_PS3_PADBUTTONOFFSET_L1,
    ASURA_PS3_KEYID_R1       = ASURA_PS3_PADBUTTONOFFSET_R1,
    ASURA_PS3_KEYID_L3       = ASURA_PS3_PADBUTTONOFFSET_L3,
    ASURA_PS3_KEYID_R3       = ASURA_PS3_PADBUTTONOFFSET_R3,
    ASURA_PS3_KEYID_UP       = ASURA_PS3_PADBUTTONOFFSET_UP,
    ASURA_PS3_KEYID_DOWN     = ASURA_PS3_PADBUTTONOFFSET_DOWN,
    ASURA_PS3_KEYID_LEFT     = ASURA_PS3_PADBUTTONOFFSET_LEFT,
    ASURA_PS3_KEYID_RIGHT    = ASURA_PS3_PADBUTTONOFFSET_RIGHT,
	// Thumbsticks
	ASURA_PS3_AXISID_LSTICK_H	= ASURA_PS3_PADBUTTONOFFSET_NEXT_PAD + ASURA_PS3_PADAXISOFFSET_LSTICK_H,
    ASURA_PS3_AXISID_LSTICK_V	= ASURA_PS3_PADBUTTONOFFSET_NEXT_PAD + ASURA_PS3_PADAXISOFFSET_LSTICK_V,
    ASURA_PS3_AXISID_RSTICK_H	= ASURA_PS3_PADBUTTONOFFSET_NEXT_PAD + ASURA_PS3_PADAXISOFFSET_RSTICK_H,
    ASURA_PS3_AXISID_RSTICK_V	= ASURA_PS3_PADBUTTONOFFSET_NEXT_PAD + ASURA_PS3_PADAXISOFFSET_RSTICK_V,
	// Sensors
	ASURA_PS3_SENSORID_AXIS_X	= ASURA_PS3_PADBUTTONOFFSET_NEXT_PAD + ASURA_PS3_PADAXISOFFSET_NEXT_PAD + ASURA_PS3_PADSENSOROFFSET_AXIS_X,
	ASURA_PS3_SENSORID_AXIS_Y	= ASURA_PS3_PADBUTTONOFFSET_NEXT_PAD + ASURA_PS3_PADAXISOFFSET_NEXT_PAD + ASURA_PS3_PADSENSOROFFSET_AXIS_Y,
	ASURA_PS3_SENSORID_AXIS_Z	= ASURA_PS3_PADBUTTONOFFSET_NEXT_PAD + ASURA_PS3_PADAXISOFFSET_NEXT_PAD + ASURA_PS3_PADSENSOROFFSET_AXIS_Z,
	ASURA_PS3_SENSORID_GYRO_YAW	= ASURA_PS3_PADBUTTONOFFSET_NEXT_PAD + ASURA_PS3_PADAXISOFFSET_NEXT_PAD + ASURA_PS3_PADSENSOROFFSET_GYRO_YAW,

	// Sensor actions
	ASURA_PS3_ACTION_SHAKE = ASURA_PS3_PADBUTTONOFFSET_NEXT_PAD + ASURA_PS3_PADAXISOFFSET_NEXT_PAD + ASURA_PS3_PADSENSOROFFSET_SHAKE,
	ASURA_PS3_ACTION_ROCKING_X = ASURA_PS3_PADBUTTONOFFSET_NEXT_PAD + ASURA_PS3_PADAXISOFFSET_NEXT_PAD + ASURA_PS3_PADSENSOROFFSET_ROCKING_X,
	// Dummy output
	ASURA_PS3_OUTPUTID_VOID,
	
	ASURA_PS3_OUTPUTID_MAX_NUMBER_OF_KEYS,
};

// P R O T O T Y P E S   A N D   I N L I N E   F U N C T I O N S /////////////

inline u_int Asura_PS3_GetAsuraKeyIDForPad( u_int uPadIdx, u_int uButtonOffset )
{
    return ASURA_KEYID_PAD1_BUTTON1 + uPadIdx * ASURA_PS3_PADBUTTONOFFSET_NEXT_PAD + uButtonOffset;
}

inline u_int Asura_PS3_GetAsuraAxisIDForPad( u_int uPadIdx, u_int uAxisOffset )
{
    return ASURA_AXIS_PAD1_LSTICK_H + uPadIdx * ASURA_PS3_PADAXISOFFSET_NEXT_PAD + uAxisOffset;
}

inline u_int Asura_PS3_GetAsuraSensorIDForPad( u_int uPadIdx, u_int uSensorOffset )
{
    return ASURA_PS3_SENSORID_PAD1_AXIS_X + uPadIdx * ASURA_PS3_PADSENSOROFFSET_NEXT_PAD + uSensorOffset;
}


class Asura_PS3_USBPad;
class Asura_PS3_USBKeyboard;

////PGH/////////////////////////////////////////
// PS3 input core                                           
////////////////////////////////////////////////
class Asura_PS3_Input
{
public:
	Asura_PS3_Input();

	void Initialise(bool bPads, bool bKeyboards);
	void Shutdown();
	void Reset();
	void UpdatePads(u_char* pucButtonOutput, float* pfAxisOutput);
	void UpdateKeyboards(u_char* pucKeyOutput, const Asura_UnicodeChar** pwszInputBfr, u_int* puInputBfrLen);
	bool IsKeyToggled(int iKeyID);
	
	int  CountActiveControllers(bool bConsecutive) const;
	Asura_PS3_USBPad* GetController(int iController);
		 
	int  GetMaxControllers() const { return ASURA_MAX_NUMBER_OF_CONTROLLER_PADS; }
	int  GetMaxKeyboards() const { return ASURA_MAX_NUMBER_OF_KEYBOARDS; }

	static Asura_PS3_Input &GetAPI() { static Asura_PS3_Input s_xInputAPI; return s_xInputAPI; }
	static bool IsInputIntercepted() { return s_bInputIntercepted; }
	
protected:
    bool InitialiseUSBPads();
    bool InitialiseUSBKeyboards();

	bool              m_bUSBPadInitialised;
	Asura_PS3_USBPad* m_apxPads[ASURA_MAX_NUMBER_OF_CONTROLLER_PADS];

	bool              m_bUSBKBInitialised;
	bool              m_bLeaveKeyboardsForPSGL;
    Asura_PS3_USBKeyboard* m_apxKeyboards[ASURA_MAX_NUMBER_OF_KEYBOARDS];

	static bool s_bInputIntercepted;
};


// E N D   F I L E   W R A P P E R ///////////////////////////////////////////

#endif // #ifndef ___ASURA_PLATFORMINPUT_H___
