Files
boo/lib/inputdev/DeviceSignature.cpp
T

89 lines
2.5 KiB
C++
Raw Normal View History

2015-08-18 12:43:30 -10:00
#include "boo/inputdev/DeviceSignature.hpp"
#include "boo/inputdev/DeviceToken.hpp"
#include "boo/inputdev/GenericPad.hpp"
2015-04-29 21:01:55 -10:00
#include "IHIDDevice.hpp"
namespace boo
{
2015-08-18 09:40:26 -10:00
extern const DeviceSignature BOO_DEVICE_SIGS[];
2015-04-29 21:01:55 -10:00
2015-08-18 09:40:26 -10:00
bool DeviceSignature::DeviceMatchToken(const DeviceToken& token, const TDeviceSignatureSet& sigSet)
2015-04-29 21:01:55 -10:00
{
2017-05-07 11:24:00 -10:00
if (token.getDeviceType() == DeviceType::HID)
{
2017-09-15 07:20:52 -10:00
bool hasGenericPad = false;
2017-05-07 11:24:00 -10:00
for (const DeviceSignature* sig : sigSet)
{
if (sig->m_vid == token.getVendorId() && sig->m_pid == token.getProductId() &&
sig->m_type != DeviceType::HID)
return false;
2017-09-15 07:20:52 -10:00
if (sig->m_typeIdx == typeid(GenericPad))
hasGenericPad = true;
2017-05-07 11:24:00 -10:00
}
2017-09-15 07:20:52 -10:00
return hasGenericPad;
2017-05-07 11:24:00 -10:00
}
2015-08-18 09:40:26 -10:00
for (const DeviceSignature* sig : sigSet)
2015-04-29 21:01:55 -10:00
{
if (sig->m_vid == token.getVendorId() && sig->m_pid == token.getProductId())
return true;
}
return false;
}
2017-09-15 07:20:52 -10:00
std::shared_ptr<IHIDDevice> IHIDDeviceNew(DeviceToken& token, const std::shared_ptr<DeviceBase>& devImp);
2017-05-07 11:24:00 -10:00
std::shared_ptr<DeviceBase> DeviceSignature::DeviceNew(DeviceToken& token)
2015-04-29 21:01:55 -10:00
{
2017-05-07 11:24:00 -10:00
std::shared_ptr<DeviceBase> retval;
2017-05-07 11:24:00 -10:00
/* Perform signature-matching to find the appropriate device-factory */
const DeviceSignature* foundSig = nullptr;
2015-08-18 09:40:26 -10:00
const DeviceSignature* sigIter = BOO_DEVICE_SIGS;
2015-04-29 21:01:55 -10:00
unsigned targetVid = token.getVendorId();
unsigned targetPid = token.getProductId();
while (sigIter->m_name)
{
if (sigIter->m_vid == targetVid && sigIter->m_pid == targetPid)
{
foundSig = sigIter;
break;
}
++sigIter;
}
if (!foundSig)
2017-05-07 11:24:00 -10:00
{
/* Try Generic HID devices */
if (token.getDeviceType() == DeviceType::HID)
{
retval = std::make_shared<GenericPad>(&token);
if (!retval)
return nullptr;
2017-09-15 07:20:52 -10:00
retval->m_hidDev = IHIDDeviceNew(token, retval);
2017-05-07 11:24:00 -10:00
if (!retval->m_hidDev)
return nullptr;
2017-05-08 17:37:12 -10:00
retval->m_hidDev->_startThread();
2017-05-07 11:24:00 -10:00
return retval;
}
return nullptr;
}
if (foundSig->m_type != DeviceType::None && foundSig->m_type != token.getDeviceType())
return nullptr;
2015-04-29 21:01:55 -10:00
retval = foundSig->m_factory(&token);
if (!retval)
2017-05-07 11:24:00 -10:00
return nullptr;
2015-04-29 21:01:55 -10:00
2017-09-15 07:20:52 -10:00
retval->m_hidDev = IHIDDeviceNew(token, retval);
2017-05-07 11:24:00 -10:00
if (!retval->m_hidDev)
return nullptr;
2017-05-08 17:37:12 -10:00
retval->m_hidDev->_startThread();
2015-04-29 21:01:55 -10:00
return retval;
}
}