00001 /************************************************************************************ 00002 00003 Filename : OVR_Linux_DeviceManager.h 00004 Content : Linux-specific DeviceManager header. 00005 Created : 00006 Authors : 00007 00008 Copyright : Copyright 2012 Oculus VR, Inc. All Rights reserved. 00009 00010 Use of this software is subject to the terms of the Oculus license 00011 agreement provided at the time of installation or download, or which 00012 otherwise accompanies this software in either electronic or hard copy form. 00013 00014 *************************************************************************************/ 00015 00016 #ifndef OVR_Linux_DeviceManager_h 00017 #define OVR_Linux_DeviceManager_h 00018 00019 #include "OVR_DeviceImpl.h" 00020 00021 #include <unistd.h> 00022 #include <sys/poll.h> 00023 00024 00025 namespace OVR { namespace Linux { 00026 00027 class DeviceManagerThread; 00028 00029 //------------------------------------------------------------------------------------- 00030 // ***** Linux DeviceManager 00031 00032 class DeviceManager : public DeviceManagerImpl 00033 { 00034 public: 00035 DeviceManager(); 00036 ~DeviceManager(); 00037 00038 // Initialize/Shutdowncreate and shutdown manger thread. 00039 virtual bool Initialize(DeviceBase* parent); 00040 virtual void Shutdown(); 00041 00042 virtual ThreadCommandQueue* GetThreadQueue(); 00043 virtual ThreadId GetThreadId() const; 00044 00045 virtual DeviceEnumerator<> EnumerateDevicesEx(const DeviceEnumerationArgs& args); 00046 00047 virtual bool GetDeviceInfo(DeviceInfo* info) const; 00048 00049 Ptr<DeviceManagerThread> pThread; 00050 }; 00051 00052 //------------------------------------------------------------------------------------- 00053 // ***** Device Manager Background Thread 00054 00055 class DeviceManagerThread : public Thread, public ThreadCommandQueue 00056 { 00057 friend class DeviceManager; 00058 enum { ThreadStackSize = 64 * 1024 }; 00059 public: 00060 DeviceManagerThread(); 00061 ~DeviceManagerThread(); 00062 00063 virtual int Run(); 00064 00065 // ThreadCommandQueue notifications for CommandEvent handling. 00066 virtual void OnPushNonEmpty_Locked() { write(CommandFd[1], this, 1); } 00067 virtual void OnPopEmpty_Locked() { } 00068 00069 class Notifier 00070 { 00071 public: 00072 // Called when I/O is received 00073 virtual void OnEvent(int i, int fd) = 0; 00074 00075 // Called when timing ticks are updated. 00076 // Returns the largest number of microseconds this function can 00077 // wait till next call. 00078 virtual UInt64 OnTicks(UInt64 ticksMks) 00079 { 00080 OVR_UNUSED1(ticksMks); 00081 return Timer::MksPerSecond * 1000; 00082 } 00083 }; 00084 00085 // Add I/O notifier 00086 bool AddSelectFd(Notifier* notify, int fd); 00087 bool RemoveSelectFd(Notifier* notify, int fd); 00088 00089 // Add notifier that will be called at regular intervals. 00090 bool AddTicksNotifier(Notifier* notify); 00091 bool RemoveTicksNotifier(Notifier* notify); 00092 00093 private: 00094 00095 bool threadInitialized() { return CommandFd[0] != 0; } 00096 00097 // pipe used to signal commands 00098 int CommandFd[2]; 00099 00100 Array<struct pollfd> PollFds; 00101 Array<Notifier*> FdNotifiers; 00102 00103 Event StartupEvent; 00104 00105 // Ticks notifiers - used for time-dependent events such as keep-alive. 00106 Array<Notifier*> TicksNotifiers; 00107 }; 00108 00109 }} // namespace Linux::OVR 00110 00111 #endif // OVR_Linux_DeviceManager_h