
///////////////////////////////////////////////////////////////////////////////
//
// File   : Asura_PS3_USBPad_SonyDualshock2.cpp
// Author : Andy Tate
// Date   : 27-Jun-2005
//
// Copyright (C) 2005 Rebellion, All Rights Reserved.
//
///////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Include files...
////////////////////////////////////////////////////////////////////////////////

#include "Core/Asura.h"

#include <cell/pad/libusbpad_c.h>

// This file's header...
#include "Input/Asura_PS3_USBPad_SonyDualshock2.h"

// Asura header-files...
#include "Debugging/Asura_Assert.h"

// Game header-files...


////////////////////////////////////////////////////////////////////////////////
// Constant declarations...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Static variable declarations...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Private functions...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Protected functions...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Public functions...
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Function     : Asura_PS3_USBPad_SonyDualshock2::Update
// Author       : Andy Tate
// Date         : 27-Jun-2005
//
// Description  : Takes the specified USB pad-data and updates the button and
//				  axis values for the Sony Dualshock2 pad accordingly.
//
// Parameters	: The SCE USB pad-data structure supplied by the O/S.
//
// Return value : None.
////////////////////////////////////////////////////////////////////////////////

void Asura_PS3_USBPad_SonyDualshock2::Update (const CellUsbPadData& xPadData)
{
	// Calculate the USB-pad axis values...

	m_afAxisValues [LAS_HORIZONTAL]	=  CalculateAxisValue (xPadData.button [0]);
	m_afAxisValues [LAS_VERTICAL]	= -CalculateAxisValue (xPadData.button [1]);
	m_afAxisValues [RAS_HORIZONTAL]	=  CalculateAxisValue (xPadData.button [3]);
	m_afAxisValues [RAS_VERTICAL]	= -CalculateAxisValue (xPadData.button [2]);


	// Convert USB-pad button values...

	m_aucButtonValues [SQUARE]		= ((xPadData.button [4] & 0x80) == 0x00) ? 0x00 : 0xFF;
	m_aucButtonValues [CROSS]		= ((xPadData.button [4] & 0x40) == 0x00) ? 0x00 : 0xFF;
	m_aucButtonValues [CIRCLE]		= ((xPadData.button [4] & 0x20) == 0x00) ? 0x00 : 0xFF;
	m_aucButtonValues [TRIANGLE]	= ((xPadData.button [4] & 0x10) == 0x00) ? 0x00 : 0xFF;

	switch (xPadData.button [4] & 0x0F)
	{
		case 0:		// None
		{
			m_aucButtonValues [DPAD_LEFT]	= 0x00;
			m_aucButtonValues [DPAD_DOWN]	= 0x00;
			m_aucButtonValues [DPAD_RIGHT]	= 0x00;
			m_aucButtonValues [DPAD_UP]		= 0x00;
			break;
		}

		case 1:		// Up
		{
			m_aucButtonValues [DPAD_LEFT]	= 0x00;
			m_aucButtonValues [DPAD_DOWN]	= 0x00;
			m_aucButtonValues [DPAD_RIGHT]	= 0x00;
			m_aucButtonValues [DPAD_UP]		= 0xFF;
			break;
		}

		case 2:		// Up-right
		{
			m_aucButtonValues [DPAD_LEFT]	= 0x00;
			m_aucButtonValues [DPAD_DOWN]	= 0x00;
			m_aucButtonValues [DPAD_RIGHT]	= 0xFF;
			m_aucButtonValues [DPAD_UP]		= 0xFF;
			break;
		}

		case 3:		// Right
		{
			m_aucButtonValues [DPAD_LEFT]	= 0x00;
			m_aucButtonValues [DPAD_DOWN]	= 0x00;
			m_aucButtonValues [DPAD_RIGHT]	= 0xFF;
			m_aucButtonValues [DPAD_UP]		= 0x00;
			break;
		}

		case 4:		// Down-right
		{
			m_aucButtonValues [DPAD_LEFT]	= 0x00;
			m_aucButtonValues [DPAD_DOWN]	= 0xFF;
			m_aucButtonValues [DPAD_RIGHT]	= 0xFF;
			m_aucButtonValues [DPAD_UP]		= 0x00;
			break;
		}

		case 5:		// Down
		{
			m_aucButtonValues [DPAD_LEFT]	= 0x00;
			m_aucButtonValues [DPAD_DOWN]	= 0xFF;
			m_aucButtonValues [DPAD_RIGHT]	= 0x00;
			m_aucButtonValues [DPAD_UP]		= 0x00;
			break;
		}

		case 6:		// Down-left
		{
			m_aucButtonValues [DPAD_LEFT]	= 0xFF;
			m_aucButtonValues [DPAD_DOWN]	= 0xFF;
			m_aucButtonValues [DPAD_RIGHT]	= 0x00;
			m_aucButtonValues [DPAD_UP]		= 0x00;
			break;
		}

		case 7:		// Left
		{
			m_aucButtonValues [DPAD_LEFT]	= 0xFF;
			m_aucButtonValues [DPAD_DOWN]	= 0x00;
			m_aucButtonValues [DPAD_RIGHT]	= 0x00;
			m_aucButtonValues [DPAD_UP]		= 0x00;
			break;
		}

		case 8:		// Up-left
		{
			m_aucButtonValues [DPAD_LEFT]	= 0xFF;
			m_aucButtonValues [DPAD_DOWN]	= 0x00;
			m_aucButtonValues [DPAD_RIGHT]	= 0x00;
			m_aucButtonValues [DPAD_UP]		= 0xFF;
			break;
		}

		default:
		{
			Asura_Assert	(false, "Unexpected return value for D-Pad.");
			break;
		}
	}		// End of switch.

	m_aucButtonValues [START]	= ((xPadData.button [5] & 0x80) == 0x00) ? 0x00 : 0xFF;
	m_aucButtonValues [R3]	    = ((xPadData.button [5] & 0x40) == 0x00) ? 0x00 : 0xFF;
	m_aucButtonValues [L3]	    = ((xPadData.button [5] & 0x20) == 0x00) ? 0x00 : 0xFF;
	m_aucButtonValues [SELECT]	= ((xPadData.button [5] & 0x10) == 0x00) ? 0x00 : 0xFF;

	m_aucButtonValues [R1]	    = ((xPadData.button [5] & 0x08) == 0x00) ? 0x00 : 0xFF;
	m_aucButtonValues [L1]		= ((xPadData.button [5] & 0x04) == 0x00) ? 0x00 : 0xFF;
	m_aucButtonValues [R2]	    = ((xPadData.button [5] & 0x02) == 0x00) ? 0x00 : 0xFF;
	m_aucButtonValues [L2]		= ((xPadData.button [5] & 0x01) == 0x00) ? 0x00 : 0xFF;
}

/// End of function 'Asura_PS3_USBPad_SonyDualshock2::Update'. ///


/// End of file. ///
