#pragma once #include "nilTypes.h" #include "nilComponents.h" #include "nilException.h" #include "nilPnP.h" #include "nilHID.h" namespace Nil { //! \addtogroup Nil //! @{ class System; class DeviceInstance; class Mouse; class Keyboard; class Controller; //! \class Device //! A generic input device in the system. class Device { friend class System; friend class XInputController; public: //! Device handler types. enum Handler: int { Handler_DirectInput = 0, //!< Implemented by DirectInput Handler_XInput, //!< Implemented by XInput Handler_RawInput //!< Implemented by Raw Input API }; //! Device types. enum Type: int { Device_Keyboard = 0, //!< I'm a keyboard Device_Mouse, //!< I'm a mouse Device_Controller //!< I'm a controller }; //! Device status types. enum Status: int { Status_Disconnected = 0, //!< Disconnected but not forgotten Status_Pending, //!< Pending refresh Status_Connected //!< Up-to-date and available }; protected: DeviceID mID; //!< Unique identifier, only valid per session Status mStatus; //!< Current status Status mSavedStatus; //!< Status backup when updating utf8String mName; //!< Device name Type mType; //!< Device type System* mSystem; //!< My owner DeviceInstance* mInstance; //!< My instance, if created bool mDisconnectFlagged; //!< Whether I am flagged for disconnection or not int mTypedIndex; //!< This is a device-type-specific index for the device explicit Device( System* system, DeviceID id, Type type ); virtual ~Device(); virtual void update(); //!< Update our instance virtual void setStatus( Status status ); //!< Set status virtual void saveStatus(); //!< Backup current status virtual const Status getSavedStatus(); //!< Get backed up status virtual void onDisconnect(); //!< On unplugged or otherwise disabled virtual void onConnect(); //!< On plugged or otherwise enabled virtual void flagDisconnected(); //!< Flag as disconnected for deletion on next update public: virtual void enable(); //!< Enable the device, creating a DeviceInstance virtual void disable(); //!< Disable the device, destroying it's DeviceInstance virtual DeviceInstance* getInstance(); //!< Get my instance, if available virtual const DeviceID getID() const; //!< Get session-specific identifier virtual const DeviceID getStaticID() const = 0; //!< Get static identifier virtual const Handler getHandler() const = 0; //!< Get my handler virtual const Type getType() const; //!< Get my type virtual const Status getStatus() const; //!< Get my status virtual const utf8String& getName() const; //!< Get my name virtual System* getSystem(); //!< Get my owning system virtual const bool isDisconnectFlagged() const; //!< Am I flagged for disconnection? }; //! A list of devices. typedef list DeviceList; //! \class DeviceInstance //! Device instance base class. class DeviceInstance { protected: System* mSystem; //!< The system Device* mDevice; //!< The device public: //! Constructor. //! \param system The system. //! \param device The device. DeviceInstance( System* system, Device* device ); //! Update this DeviceInstance. //! \note This is called by System, no need to do it yourself. virtual void update() = 0; //! Get the device that owns me. virtual const Device* getDevice() const; //! Destructor. virtual ~DeviceInstance(); }; //! \brief A list of device instances. typedef list DeviceInstanceList; //! \addtogroup Mouse //! @{ //! \struct MouseState //! Mouse state structure. struct MouseState { public: MouseState(); void reset(); //!< Reset the state of one-shot components vector