mirror of
https://github.com/AxioDL/boo.git
synced 2025-05-16 12:21:25 +00:00
lots of HID implementation (OS X only for now)
This commit is contained in:
parent
03a325b8ac
commit
edaebc5e50
@ -1,16 +1,21 @@
|
|||||||
#ifndef BOO_HPP
|
#ifndef BOO_HPP
|
||||||
#define BOO_HPP
|
#define BOO_HPP
|
||||||
|
|
||||||
#include "IGraphicsContext.hpp"
|
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
#error "No support for WGL"
|
#error "No support for WGL"
|
||||||
|
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
#include "mac/CCGLContext.hpp"
|
#include "mac/CCGLContext.hpp"
|
||||||
typedef CCGLContext CGraphicsContext;
|
typedef CCGLContext CGraphicsContext;
|
||||||
|
|
||||||
|
|
||||||
#elif defined(__GNUC__) || defined(__clang__)
|
#elif defined(__GNUC__) || defined(__clang__)
|
||||||
#include "x11/CGLXContext.hpp"
|
#include "x11/CGLXContext.hpp"
|
||||||
typedef CGLXContext CGraphicsContext;
|
typedef CGLXContext CGraphicsContext;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "IGraphicsContext.hpp"
|
||||||
|
#include "inputdev/CDeviceFinder.hpp"
|
||||||
|
|
||||||
#endif // BOO_HPP
|
#endif // BOO_HPP
|
||||||
|
@ -1,13 +1,18 @@
|
|||||||
#ifndef CDEVICEBASE
|
#ifndef CDEVICEBASE
|
||||||
#define CDEVICEBASE
|
#define CDEVICEBASE
|
||||||
|
|
||||||
#include "CDeviceToken.hpp"
|
class CDeviceToken;
|
||||||
|
class IHIDDevice;
|
||||||
|
|
||||||
class CDeviceBase
|
class CDeviceBase
|
||||||
{
|
{
|
||||||
|
CDeviceToken* m_token;
|
||||||
|
IHIDDevice* m_hidDev;
|
||||||
public:
|
public:
|
||||||
|
inline CDeviceBase(CDeviceToken* token, IHIDDevice* hidDev)
|
||||||
|
: m_token(token), m_hidDev(hidDev) {}
|
||||||
|
void _deviceDisconnected();
|
||||||
|
virtual void deviceDisconnected()=0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CDEVICEBASE
|
#endif // CDEVICEBASE
|
||||||
|
@ -1,5 +1,131 @@
|
|||||||
#ifndef CDEVICEFINDER_HPP
|
#ifndef CDEVICEFINDER_HPP
|
||||||
#define CDEVICEFINDER_HPP
|
#define CDEVICEFINDER_HPP
|
||||||
|
|
||||||
|
#include <set>
|
||||||
|
#include <mutex>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include "CDeviceToken.hpp"
|
||||||
|
#include "IHIDListener.hpp"
|
||||||
|
#include "DeviceClasses.hpp"
|
||||||
|
|
||||||
|
static class CDeviceFinder* skDevFinder = NULL;
|
||||||
|
|
||||||
|
class CDeviceFinder
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
friend class CHIDListenerIOKit;
|
||||||
|
friend class CHIDListenerUdev;
|
||||||
|
friend class CHIDListenerWin32;
|
||||||
|
static inline CDeviceFinder* instance() {return skDevFinder;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
/* Types this finder is interested in (immutable) */
|
||||||
|
EDeviceMask m_types;
|
||||||
|
|
||||||
|
/* Platform-specific USB event registration
|
||||||
|
* (for auto-scanning, NULL if not registered) */
|
||||||
|
IHIDListener* m_listener;
|
||||||
|
|
||||||
|
/* Set of presently-connected device tokens */
|
||||||
|
TDeviceTokens m_tokens;
|
||||||
|
std::mutex m_tokensLock;
|
||||||
|
|
||||||
|
/* Friend methods for platform-listener to find/insert/remove
|
||||||
|
* tokens with type-filtering */
|
||||||
|
inline bool _hasToken(TDeviceHandle handle)
|
||||||
|
{
|
||||||
|
auto preCheck = m_tokens.find(handle);
|
||||||
|
if (preCheck != m_tokens.end())
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
inline void _insertToken(CDeviceToken&& token)
|
||||||
|
{
|
||||||
|
if (BooDeviceMatchToken(token, m_types)) {
|
||||||
|
m_tokensLock.lock();
|
||||||
|
m_tokens.insert(std::make_pair(token.getDeviceHandle(), token));
|
||||||
|
m_tokensLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inline void _removeToken(TDeviceHandle handle)
|
||||||
|
{
|
||||||
|
auto preCheck = m_tokens.find(handle);
|
||||||
|
if (preCheck != m_tokens.end())
|
||||||
|
{
|
||||||
|
CDeviceToken& tok = preCheck->second;
|
||||||
|
tok._deviceClose();
|
||||||
|
m_tokensLock.lock();
|
||||||
|
m_tokens.erase(preCheck);
|
||||||
|
m_tokensLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
class CDeviceTokensHandle
|
||||||
|
{
|
||||||
|
CDeviceFinder& m_finder;
|
||||||
|
public:
|
||||||
|
inline CDeviceTokensHandle(CDeviceFinder& finder) : m_finder(finder)
|
||||||
|
{m_finder.m_tokensLock.lock();}
|
||||||
|
inline ~CDeviceTokensHandle() {m_finder.m_tokensLock.unlock();}
|
||||||
|
inline TDeviceTokens::iterator begin() {return m_finder.m_tokens.begin();}
|
||||||
|
inline TDeviceTokens::iterator end() {return m_finder.m_tokens.end();}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Application must specify its interested device-types */
|
||||||
|
CDeviceFinder(EDeviceMask types, bool autoScan=true)
|
||||||
|
: m_types(types), m_listener(NULL)
|
||||||
|
{
|
||||||
|
if (skDevFinder)
|
||||||
|
throw std::runtime_error("only one instance of CDeviceFinder may be constructed");
|
||||||
|
skDevFinder = this;
|
||||||
|
if (autoScan)
|
||||||
|
startScanning();
|
||||||
|
}
|
||||||
|
~CDeviceFinder()
|
||||||
|
{
|
||||||
|
if (m_listener)
|
||||||
|
m_listener->stopScanning();
|
||||||
|
delete m_listener;
|
||||||
|
skDevFinder = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get interested device-type mask */
|
||||||
|
inline EDeviceMask getTypes() const {return m_types;}
|
||||||
|
|
||||||
|
/* Iterable set of tokens */
|
||||||
|
inline CDeviceTokensHandle getTokens() {return CDeviceTokensHandle(*this);}
|
||||||
|
|
||||||
|
/* Automatic device scanning */
|
||||||
|
inline bool startScanning()
|
||||||
|
{
|
||||||
|
if (!m_listener)
|
||||||
|
m_listener = IHIDListenerNew(*this);
|
||||||
|
if (m_listener)
|
||||||
|
return m_listener->startScanning();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
inline bool stopScanning()
|
||||||
|
{
|
||||||
|
if (!m_listener)
|
||||||
|
m_listener = IHIDListenerNew(*this);
|
||||||
|
if (m_listener)
|
||||||
|
return m_listener->stopScanning();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Manual device scanning */
|
||||||
|
inline bool scanNow()
|
||||||
|
{
|
||||||
|
if (!m_listener)
|
||||||
|
m_listener = IHIDListenerNew(*this);
|
||||||
|
if (m_listener)
|
||||||
|
return m_listener->scanNow();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
#endif // CDEVICEFINDER_HPP
|
#endif // CDEVICEFINDER_HPP
|
||||||
|
@ -2,21 +2,65 @@
|
|||||||
#define CDEVICETOKEN
|
#define CDEVICETOKEN
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <IOKit/hid/IOHIDDevice.h>
|
#include "CDeviceBase.hpp"
|
||||||
|
#include "DeviceClasses.hpp"
|
||||||
|
|
||||||
|
#if __APPLE__
|
||||||
|
#include <IOKit/hid/IOHIDLib.h>
|
||||||
|
typedef IOHIDDeviceRef TDeviceHandle;
|
||||||
|
#elif _WIN32
|
||||||
|
#elif __linux__
|
||||||
|
#endif
|
||||||
|
|
||||||
class CDeviceBase;
|
class CDeviceBase;
|
||||||
|
|
||||||
class CDeviceToken
|
class CDeviceToken
|
||||||
{
|
{
|
||||||
std::string m_name;
|
unsigned m_vendorId;
|
||||||
#if __APPLE__
|
unsigned m_productId;
|
||||||
|
std::string m_vendorName;
|
||||||
|
std::string m_productName;
|
||||||
|
TDeviceHandle m_devHandle;
|
||||||
|
|
||||||
#elif _WIN32
|
friend CDeviceBase;
|
||||||
#elif __linux__
|
CDeviceBase* m_connectedDev;
|
||||||
#endif
|
|
||||||
public:
|
public:
|
||||||
const std::string& getName() const;
|
inline CDeviceToken(unsigned vid, unsigned pid, const char* vname, const char* pname, TDeviceHandle handle)
|
||||||
CDeviceBase* getDevice() const;
|
: m_vendorId(vid), m_productId(pid), m_devHandle(handle), m_connectedDev(NULL)
|
||||||
|
{
|
||||||
|
if (vname)
|
||||||
|
m_vendorName = vname;
|
||||||
|
if (pname)
|
||||||
|
m_productName = pname;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline unsigned getVendorId() const {return m_vendorId;}
|
||||||
|
inline unsigned getProductId() const {return m_productId;}
|
||||||
|
inline const std::string& getVendorName() const {return m_vendorName;}
|
||||||
|
inline const std::string& getProductName() const {return m_productName;}
|
||||||
|
inline TDeviceHandle getDeviceHandle() const {return m_devHandle;}
|
||||||
|
inline bool isDeviceOpen() const {return m_connectedDev;}
|
||||||
|
inline CDeviceBase* openAndGetDevice()
|
||||||
|
{
|
||||||
|
if (!m_connectedDev)
|
||||||
|
m_connectedDev = BooDeviceNew(this);
|
||||||
|
return m_connectedDev;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void _deviceClose()
|
||||||
|
{
|
||||||
|
if (m_connectedDev)
|
||||||
|
m_connectedDev->deviceDisconnected();
|
||||||
|
m_connectedDev = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline CDeviceToken operator =(const CDeviceToken& other)
|
||||||
|
{return CDeviceToken(other);}
|
||||||
|
inline bool operator ==(const CDeviceToken& rhs) const
|
||||||
|
{return m_devHandle == rhs.m_devHandle;}
|
||||||
|
inline bool operator <(const CDeviceToken& rhs) const
|
||||||
|
{return m_devHandle < rhs.m_devHandle;}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CDEVICETOKEN
|
#endif // CDEVICETOKEN
|
||||||
|
@ -1,5 +1,17 @@
|
|||||||
#ifndef CDOLPHINSMASHADAPTER_HPP
|
#ifndef CDOLPHINSMASHADAPTER_HPP
|
||||||
#define CDOLPHINSMASHADAPTER_HPP
|
#define CDOLPHINSMASHADAPTER_HPP
|
||||||
|
|
||||||
|
#include "CDeviceBase.hpp"
|
||||||
|
|
||||||
|
class CDolphinSmashAdapter final : public CDeviceBase
|
||||||
|
{
|
||||||
|
void deviceDisconnected();
|
||||||
|
public:
|
||||||
|
CDolphinSmashAdapter(CDeviceToken* token, IHIDDevice* hidDev)
|
||||||
|
: CDeviceBase(token, hidDev)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
#endif // CDOLPHINSMASHADAPTER_HPP
|
#endif // CDOLPHINSMASHADAPTER_HPP
|
||||||
|
24
include/inputdev/DeviceClasses.hpp
Normal file
24
include/inputdev/DeviceClasses.hpp
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#ifndef CDEVICECLASSES_HPP
|
||||||
|
#define CDEVICECLASSES_HPP
|
||||||
|
|
||||||
|
#include "CDolphinSmashAdapter.hpp"
|
||||||
|
#include "CRevolutionPad.hpp"
|
||||||
|
#include "CCafeProPad.hpp"
|
||||||
|
#include "CDualshockPad.hpp"
|
||||||
|
#include "CGenericPad.hpp"
|
||||||
|
|
||||||
|
enum EDeviceMask
|
||||||
|
{
|
||||||
|
DEV_NONE = 0,
|
||||||
|
DEV_DOL_SMASH_ADAPTER = 1<<0,
|
||||||
|
DEV_RVL_PAD = 1<<1,
|
||||||
|
DEV_CAFE_PRO_PAD = 1<<2,
|
||||||
|
DEV_DUALSHOCK_PAD = 1<<3,
|
||||||
|
DEV_GENERIC_PAD = 1<<4,
|
||||||
|
DEV_ALL = 0xff
|
||||||
|
};
|
||||||
|
|
||||||
|
bool BooDeviceMatchToken(const CDeviceToken& token, EDeviceMask mask);
|
||||||
|
CDeviceBase* BooDeviceNew(CDeviceToken* token);
|
||||||
|
|
||||||
|
#endif // CDEVICECLASSES_HPP
|
@ -17,6 +17,7 @@ HEADERS += \
|
|||||||
$$PWD/include/inputdev/CDeviceFinder.hpp \
|
$$PWD/include/inputdev/CDeviceFinder.hpp \
|
||||||
$$PWD/include/inputdev/CDeviceToken.hpp \
|
$$PWD/include/inputdev/CDeviceToken.hpp \
|
||||||
$$PWD/include/inputdev/CDeviceBase.hpp \
|
$$PWD/include/inputdev/CDeviceBase.hpp \
|
||||||
|
$$PWD/include/inputdev/DeviceClasses.hpp \
|
||||||
$$PWD/src/inputdev/IHIDDevice.hpp \
|
$$PWD/src/inputdev/IHIDDevice.hpp \
|
||||||
$$PWD/src/inputdev/IHIDListener.hpp
|
$$PWD/src/inputdev/IHIDListener.hpp
|
||||||
|
|
||||||
@ -39,8 +40,8 @@ SOURCES += \
|
|||||||
$$PWD/src/inputdev/CCafeProPad.cpp \
|
$$PWD/src/inputdev/CCafeProPad.cpp \
|
||||||
$$PWD/src/inputdev/CDualshockPad.cpp \
|
$$PWD/src/inputdev/CDualshockPad.cpp \
|
||||||
$$PWD/src/inputdev/CGenericPad.cpp \
|
$$PWD/src/inputdev/CGenericPad.cpp \
|
||||||
$$PWD/src/inputdev/CDeviceFinder.cpp \
|
$$PWD/src/inputdev/CDeviceBase.cpp \
|
||||||
$$PWD/src/inputdev/CDeviceBase.cpp
|
$$PWD/src/inputdev/DeviceClasses.cpp
|
||||||
|
|
||||||
unix:!macx:SOURCES += \
|
unix:!macx:SOURCES += \
|
||||||
$$PWD/src/x11/CGLXContext.cpp \
|
$$PWD/src/x11/CGLXContext.cpp \
|
||||||
|
@ -1,3 +1,15 @@
|
|||||||
#include "inputdev/CDeviceBase.hpp"
|
#include "inputdev/CDeviceBase.hpp"
|
||||||
|
#include "inputdev/CDeviceToken.hpp"
|
||||||
|
#include "IHIDDevice.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
void CDeviceBase::_deviceDisconnected()
|
||||||
|
{
|
||||||
|
m_token->m_connectedDev = NULL;
|
||||||
|
m_token = NULL;
|
||||||
|
m_hidDev->deviceDisconnected();
|
||||||
|
m_hidDev = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1 +0,0 @@
|
|||||||
#include "inputdev/CDeviceFinder.hpp"
|
|
@ -1 +1,6 @@
|
|||||||
#include "inputdev/CDolphinSmashAdapter.hpp"
|
#include "inputdev/CDolphinSmashAdapter.hpp"
|
||||||
|
|
||||||
|
void CDolphinSmashAdapter::deviceDisconnected()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -1 +1,30 @@
|
|||||||
#include "IHIDDevice.hpp"
|
#include "IHIDDevice.hpp"
|
||||||
|
#include "inputdev/CDeviceToken.hpp"
|
||||||
|
#include <IOKit/hid/IOHIDLib.h>
|
||||||
|
|
||||||
|
class CHIDDeviceIOKit final : public IHIDDevice
|
||||||
|
{
|
||||||
|
IOHIDDeviceRef m_dev;
|
||||||
|
public:
|
||||||
|
|
||||||
|
CHIDDeviceIOKit(CDeviceToken* token)
|
||||||
|
: m_dev(token->getDeviceHandle())
|
||||||
|
{
|
||||||
|
IOHIDDeviceOpen(m_dev, kIOHIDOptionsTypeNone);
|
||||||
|
}
|
||||||
|
|
||||||
|
CHIDDeviceIOKit()
|
||||||
|
{
|
||||||
|
IOHIDDeviceClose(m_dev, kIOHIDOptionsTypeNone);
|
||||||
|
}
|
||||||
|
|
||||||
|
void deviceDisconnected()
|
||||||
|
{
|
||||||
|
IOHIDDeviceClose(m_dev, kIOHIDOptionsTypeNone);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
IHIDDevice* IHIDDeviceNew(CDeviceToken* token)
|
||||||
|
{
|
||||||
|
return new CHIDDeviceIOKit(token);
|
||||||
|
}
|
||||||
|
114
src/inputdev/CHIDListenerIOKit.cpp
Normal file
114
src/inputdev/CHIDListenerIOKit.cpp
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
#include "IHIDListener.hpp"
|
||||||
|
#include "inputdev/CDeviceFinder.hpp"
|
||||||
|
#include <CoreFoundation/CoreFoundation.h>
|
||||||
|
#include <IOKit/hid/IOHIDLib.h>
|
||||||
|
|
||||||
|
class CHIDListenerIOKit final : public IHIDListener
|
||||||
|
{
|
||||||
|
CDeviceFinder& m_finder;
|
||||||
|
|
||||||
|
IOHIDManagerRef m_hidManager;
|
||||||
|
bool m_scanningEnabled;
|
||||||
|
|
||||||
|
static void deviceConnected(CHIDListenerIOKit* listener,
|
||||||
|
IOReturn,
|
||||||
|
void*,
|
||||||
|
IOHIDDeviceRef device)
|
||||||
|
{
|
||||||
|
if (!listener->m_scanningEnabled)
|
||||||
|
return;
|
||||||
|
if (listener->m_finder._hasToken(device))
|
||||||
|
return;
|
||||||
|
CFIndex vid, pid;
|
||||||
|
CFNumberGetValue((CFNumberRef)IOHIDDeviceGetProperty(device, CFSTR(kIOHIDVendorIDKey)), kCFNumberCFIndexType, &vid);
|
||||||
|
CFNumberGetValue((CFNumberRef)IOHIDDeviceGetProperty(device, CFSTR(kIOHIDProductIDKey)), kCFNumberCFIndexType, &pid);
|
||||||
|
CFStringRef manuf = (CFStringRef)IOHIDDeviceGetProperty(device, CFSTR(kIOHIDManufacturerKey));
|
||||||
|
CFStringRef product = (CFStringRef)IOHIDDeviceGetProperty(device, CFSTR(kIOHIDProductKey));
|
||||||
|
listener->m_finder._insertToken(CDeviceToken(vid, pid,
|
||||||
|
CFStringGetCStringPtr(manuf, kCFStringEncodingUTF8),
|
||||||
|
CFStringGetCStringPtr(product, kCFStringEncodingUTF8),
|
||||||
|
device));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void deviceDisconnected(CHIDListenerIOKit* listener,
|
||||||
|
IOReturn,
|
||||||
|
void*,
|
||||||
|
IOHIDDeviceRef device)
|
||||||
|
{listener->m_finder._removeToken(device);}
|
||||||
|
|
||||||
|
static void applyDevice(IOHIDDeviceRef device, CHIDListenerIOKit* listener)
|
||||||
|
{
|
||||||
|
auto preCheck = listener->m_finder.m_tokens.find(device);
|
||||||
|
if (preCheck != listener->m_finder.m_tokens.end())
|
||||||
|
return;
|
||||||
|
CFIndex vid, pid;
|
||||||
|
CFNumberGetValue((CFNumberRef)IOHIDDeviceGetProperty(device, CFSTR(kIOHIDVendorIDKey)), kCFNumberCFIndexType, &vid);
|
||||||
|
CFNumberGetValue((CFNumberRef)IOHIDDeviceGetProperty(device, CFSTR(kIOHIDProductIDKey)), kCFNumberCFIndexType, &pid);
|
||||||
|
CFStringRef manuf = (CFStringRef)IOHIDDeviceGetProperty(device, CFSTR(kIOHIDManufacturerKey));
|
||||||
|
CFStringRef product = (CFStringRef)IOHIDDeviceGetProperty(device, CFSTR(kIOHIDProductKey));
|
||||||
|
listener->m_finder.m_tokens.insert(std::make_pair(device,
|
||||||
|
CDeviceToken(vid, pid,
|
||||||
|
CFStringGetCStringPtr(manuf, kCFStringEncodingUTF8),
|
||||||
|
CFStringGetCStringPtr(product, kCFStringEncodingUTF8),
|
||||||
|
device)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
CHIDListenerIOKit(CDeviceFinder& finder)
|
||||||
|
: m_finder(finder)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* Register HID Manager */
|
||||||
|
m_hidManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDManagerOptionNone);
|
||||||
|
IOHIDManagerSetDeviceMatching(m_hidManager, NULL);
|
||||||
|
IOHIDManagerRegisterDeviceMatchingCallback(m_hidManager, (IOHIDDeviceCallback)deviceConnected, this);
|
||||||
|
IOHIDManagerRegisterDeviceRemovalCallback(m_hidManager, (IOHIDDeviceCallback)deviceDisconnected, this);
|
||||||
|
IOHIDManagerScheduleWithRunLoop(m_hidManager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
|
||||||
|
IOReturn ret = IOHIDManagerOpen(m_hidManager, kIOHIDManagerOptionNone);
|
||||||
|
if (ret != kIOReturnSuccess)
|
||||||
|
throw std::runtime_error("error establishing IOHIDManager");
|
||||||
|
|
||||||
|
/* Initial Device Add */
|
||||||
|
m_scanningEnabled = true;
|
||||||
|
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, false);
|
||||||
|
m_scanningEnabled = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
~CHIDListenerIOKit()
|
||||||
|
{
|
||||||
|
IOHIDManagerUnscheduleFromRunLoop(m_hidManager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
|
||||||
|
IOHIDManagerClose(m_hidManager, kIOHIDManagerOptionNone);
|
||||||
|
CFRelease(m_hidManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Automatic device scanning */
|
||||||
|
bool startScanning()
|
||||||
|
{
|
||||||
|
m_scanningEnabled = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
bool stopScanning()
|
||||||
|
{
|
||||||
|
m_scanningEnabled = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Manual device scanning */
|
||||||
|
bool scanNow()
|
||||||
|
{
|
||||||
|
CFSetRef devs = IOHIDManagerCopyDevices(m_hidManager);
|
||||||
|
m_finder.m_tokensLock.lock();
|
||||||
|
CFSetApplyFunction(devs, (CFSetApplierFunction)applyDevice, this);
|
||||||
|
m_finder.m_tokensLock.unlock();
|
||||||
|
CFRelease(devs);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
IHIDListener* IHIDListenerNew(CDeviceFinder& finder)
|
||||||
|
{
|
||||||
|
return new CHIDListenerIOKit(finder);
|
||||||
|
}
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
#include "IHIDListener.hpp"
|
|
21
src/inputdev/DeviceClasses.cpp
Normal file
21
src/inputdev/DeviceClasses.cpp
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#include "inputdev/DeviceClasses.hpp"
|
||||||
|
#include "inputdev/CDeviceToken.hpp"
|
||||||
|
|
||||||
|
bool BooDeviceMatchToken(const CDeviceToken& token, EDeviceMask mask)
|
||||||
|
{
|
||||||
|
if (mask & DEV_DOL_SMASH_ADAPTER &&
|
||||||
|
token.getVendorId() == 0x57e && token.getProductId() == 0x337)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
IHIDDevice* IHIDDeviceNew(CDeviceToken* token);
|
||||||
|
CDeviceBase* BooDeviceNew(CDeviceToken* token)
|
||||||
|
{
|
||||||
|
IHIDDevice* newDev = IHIDDeviceNew(token);
|
||||||
|
|
||||||
|
if (token->getVendorId() == 0x57e && token->getProductId() == 0x337)
|
||||||
|
return new CDolphinSmashAdapter(token, newDev);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
@ -1,9 +1,13 @@
|
|||||||
#ifndef IHIDDEVICE_HPP
|
#ifndef IHIDDEVICE_HPP
|
||||||
#define IHIDDEVICE_HPP
|
#define IHIDDEVICE_HPP
|
||||||
|
|
||||||
|
#include "inputdev/CDeviceToken.hpp"
|
||||||
|
class CDeviceBase;
|
||||||
|
|
||||||
class IHIDDevice
|
class IHIDDevice
|
||||||
{
|
{
|
||||||
|
friend CDeviceBase;
|
||||||
|
virtual void deviceDisconnected()=0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // IHIDDEVICE_HPP
|
#endif // IHIDDEVICE_HPP
|
||||||
|
@ -1,9 +1,27 @@
|
|||||||
#ifndef IHIDLISTENER_HPP
|
#ifndef IHIDLISTENER_HPP
|
||||||
#define IHIDLISTENER_HPP
|
#define IHIDLISTENER_HPP
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <mutex>
|
||||||
|
#include "CDeviceToken.hpp"
|
||||||
|
typedef std::map<TDeviceHandle, CDeviceToken> TDeviceTokens;
|
||||||
|
class CDeviceFinder;
|
||||||
|
|
||||||
class IHIDListener
|
class IHIDListener
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
virtual ~IHIDListener() {};
|
||||||
|
|
||||||
|
/* Automatic device scanning */
|
||||||
|
virtual bool startScanning()=0;
|
||||||
|
virtual bool stopScanning()=0;
|
||||||
|
|
||||||
|
/* Manual device scanning */
|
||||||
|
virtual bool scanNow()=0;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Platform-specific constructor */
|
||||||
|
IHIDListener* IHIDListenerNew(CDeviceFinder& finder);
|
||||||
|
|
||||||
#endif // IHIDLISTENER_HPP
|
#endif // IHIDLISTENER_HPP
|
||||||
|
@ -1,14 +1,21 @@
|
|||||||
|
|
||||||
|
#include <CoreFoundation/CoreFoundation.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <boo.hpp>
|
#include <boo.hpp>
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
|
CDeviceFinder finder(DEV_DOL_SMASH_ADAPTER);
|
||||||
|
CDeviceToken& smashToken = finder.getTokens().begin()->second;
|
||||||
|
CDolphinSmashAdapter* smashAdapter = dynamic_cast<CDolphinSmashAdapter*>(smashToken.openAndGetDevice());
|
||||||
|
|
||||||
IGraphicsContext* ctx = new CGraphicsContext;
|
IGraphicsContext* ctx = new CGraphicsContext;
|
||||||
|
|
||||||
if (ctx->create())
|
if (ctx->create())
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CFRunLoopRun();
|
||||||
|
|
||||||
delete ctx;
|
delete ctx;
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user