nuclear@1: /************************************************************************************ nuclear@1: nuclear@1: Filename : OVR_Linux_DeviceManager.h nuclear@1: Content : Linux-specific DeviceManager header. nuclear@1: Created : nuclear@1: Authors : nuclear@1: nuclear@1: Copyright : Copyright 2012 Oculus VR, Inc. All Rights reserved. nuclear@1: nuclear@1: Use of this software is subject to the terms of the Oculus license nuclear@1: agreement provided at the time of installation or download, or which nuclear@1: otherwise accompanies this software in either electronic or hard copy form. nuclear@1: nuclear@1: *************************************************************************************/ nuclear@1: nuclear@1: #ifndef OVR_Linux_DeviceManager_h nuclear@1: #define OVR_Linux_DeviceManager_h nuclear@1: nuclear@1: #include "OVR_DeviceImpl.h" nuclear@1: nuclear@1: #include nuclear@1: #include nuclear@1: nuclear@1: nuclear@1: namespace OVR { namespace Linux { nuclear@1: nuclear@1: class DeviceManagerThread; nuclear@1: nuclear@1: //------------------------------------------------------------------------------------- nuclear@1: // ***** Linux DeviceManager nuclear@1: nuclear@1: class DeviceManager : public DeviceManagerImpl nuclear@1: { nuclear@1: public: nuclear@1: DeviceManager(); nuclear@1: ~DeviceManager(); nuclear@1: nuclear@1: // Initialize/Shutdowncreate and shutdown manger thread. nuclear@1: virtual bool Initialize(DeviceBase* parent); nuclear@1: virtual void Shutdown(); nuclear@1: nuclear@1: virtual ThreadCommandQueue* GetThreadQueue(); nuclear@1: virtual ThreadId GetThreadId() const; nuclear@1: nuclear@1: virtual DeviceEnumerator<> EnumerateDevicesEx(const DeviceEnumerationArgs& args); nuclear@1: nuclear@1: virtual bool GetDeviceInfo(DeviceInfo* info) const; nuclear@1: nuclear@1: Ptr pThread; nuclear@1: }; nuclear@1: nuclear@1: //------------------------------------------------------------------------------------- nuclear@1: // ***** Device Manager Background Thread nuclear@1: nuclear@1: class DeviceManagerThread : public Thread, public ThreadCommandQueue nuclear@1: { nuclear@1: friend class DeviceManager; nuclear@1: enum { ThreadStackSize = 64 * 1024 }; nuclear@1: public: nuclear@1: DeviceManagerThread(); nuclear@1: ~DeviceManagerThread(); nuclear@1: nuclear@1: virtual int Run(); nuclear@1: nuclear@1: // ThreadCommandQueue notifications for CommandEvent handling. nuclear@1: virtual void OnPushNonEmpty_Locked() { write(CommandFd[1], this, 1); } nuclear@1: virtual void OnPopEmpty_Locked() { } nuclear@1: nuclear@1: class Notifier nuclear@1: { nuclear@1: public: nuclear@1: // Called when I/O is received nuclear@1: virtual void OnEvent(int i, int fd) = 0; nuclear@1: nuclear@1: // Called when timing ticks are updated. nuclear@1: // Returns the largest number of microseconds this function can nuclear@1: // wait till next call. nuclear@1: virtual UInt64 OnTicks(UInt64 ticksMks) nuclear@1: { nuclear@1: OVR_UNUSED1(ticksMks); nuclear@1: return Timer::MksPerSecond * 1000; nuclear@1: } nuclear@1: }; nuclear@1: nuclear@1: // Add I/O notifier nuclear@1: bool AddSelectFd(Notifier* notify, int fd); nuclear@1: bool RemoveSelectFd(Notifier* notify, int fd); nuclear@1: nuclear@1: // Add notifier that will be called at regular intervals. nuclear@1: bool AddTicksNotifier(Notifier* notify); nuclear@1: bool RemoveTicksNotifier(Notifier* notify); nuclear@1: nuclear@1: private: nuclear@1: nuclear@1: bool threadInitialized() { return CommandFd[0] != 0; } nuclear@1: nuclear@1: // pipe used to signal commands nuclear@1: int CommandFd[2]; nuclear@1: nuclear@1: Array PollFds; nuclear@1: Array FdNotifiers; nuclear@1: nuclear@1: Event StartupEvent; nuclear@1: nuclear@1: // Ticks notifiers - used for time-dependent events such as keep-alive. nuclear@1: Array TicksNotifiers; nuclear@1: }; nuclear@1: nuclear@1: }} // namespace Linux::OVR nuclear@1: nuclear@1: #endif // OVR_Linux_DeviceManager_h