#pragma once

#include "Mix/Private/HID/RawInputDevice.h"
#include "Mix/HID/IKeyboard.h"
#include "Mix/Semaphore.h"
#include "Mix/CriticalSection.h"

namespace Mix{ namespace HID{

	class Keyboard : public Mix::HID::IKeyboard, public Mix::HID::RawInputDevice
	{
	public:
		static Keyboard* CreateInstance( HWND hWnd );

	private:
		HWND	m_hWnd;				//ウィンドウハンドル
		Boolean	m_bEnableUpdate;	//更新が有効な場合は True

		UInt8	m_VKConvTable[256];	//仮想キー変換テーブル

		UInt32 m_KeyStateArray[Mix::HID::KEY_MAX];	//キー状態配列

		UInt8	m_KeyInfoList[Mix::HID::KEY_MAX];	//キー情報リスト( 0x00:アップ 0xFF:ダウン )

		UInt8	m_UpdateKeyList[Mix::HID::KEY_MAX];	//更新されたキーのリスト
		UInt8	m_UpdateKeyCount;							//更新されたキーの数

		UInt16	m_LastUpdateKeyList[Mix::HID::KEY_MAX];	//前回更新したキーのリスト
		UInt8	m_LastUpdateKeyCount;							//前回更新したキーの数

	private:
		Keyboard( HWND hWnd );
		virtual ~Keyboard( void );

	public:
		virtual void ProcessInput( const RAWINPUT* pInput );
		virtual void MessageProc( UInt32 msg, WPARAM wParam, LPARAM lParam );

	public:
		virtual void Update( void );

	public:
		virtual UInt32 GetKeyState( Mix::HID::KEY key ) const;
	};

}}
