Play-/Source/input/InputProvider.h

91 lines
2 KiB
C
Raw Normal View History

#pragma once
#include "Types.h"
#include "signal/Signal.h"
#include <array>
#include <functional>
#include <string>
2018-11-26 13:03:45 -05:00
#include <cstring>
static const uint32 DeviceIdTypeCount = 6;
typedef std::array<uint32, DeviceIdTypeCount> DeviceIdType;
struct DEVICEINFO
{
uint32 providerId = 0;
DeviceIdType deviceId = {{0, 0, 0, 0, 0, 0}};
std::string name;
};
struct BINDINGTARGET
{
//AXIS has a value from 0x00 to 0xFF (0x7F is neutral)
//POVHAT has a value from 0 to 7 (POVHAT_MAX is neutral)
enum class KEYTYPE
{
BUTTON,
AXIS,
2023-10-30 22:11:10 +00:00
POVHAT,
MOTOR
};
2018-11-28 22:32:27 -05:00
2018-11-21 12:41:13 -05:00
enum
{
2019-06-19 20:00:57 -04:00
AXIS_MIN = 0,
AXIS_NEUTRAL = 0x7F,
AXIS_MAX = 0xFF,
2018-11-21 12:41:13 -05:00
POVHAT_MAX = 8,
};
BINDINGTARGET() = default;
BINDINGTARGET(uint32 providerId, DeviceIdType deviceId, uint32 keyId, KEYTYPE keyType)
2018-11-28 22:32:27 -05:00
: providerId(providerId)
, deviceId(deviceId)
, keyId(keyId)
, keyType(keyType)
{
}
2018-11-28 22:32:27 -05:00
bool IsEqualTo(const BINDINGTARGET& target) const
{
2018-11-28 22:32:27 -05:00
return (providerId == target.providerId) &&
(keyId == target.keyId) &&
(keyType == target.keyType) &&
(memcmp(deviceId.data(), target.deviceId.data(), deviceId.size()) == 0);
}
2018-11-28 22:32:27 -05:00
bool operator==(const BINDINGTARGET& target) const
{
return IsEqualTo(target);
}
2018-11-28 22:32:27 -05:00
bool operator!=(const BINDINGTARGET& target) const
{
return !IsEqualTo(target);
}
2018-11-28 22:32:27 -05:00
uint32 providerId = 0;
2018-11-28 22:32:27 -05:00
DeviceIdType deviceId = {{0, 0, 0, 0, 0, 0}};
uint32 keyId = 0;
KEYTYPE keyType = KEYTYPE::BUTTON;
};
2018-11-28 22:32:27 -05:00
typedef std::function<void(const BINDINGTARGET&, uint32)> InputEventFunction;
class CInputProvider
{
public:
virtual ~CInputProvider() = default;
virtual uint32 GetId() const = 0;
virtual std::string GetTargetDescription(const BINDINGTARGET&) const = 0;
2023-10-31 00:28:16 +00:00
virtual std::vector<DEVICEINFO> GetDevices() const
{
return {};
};
virtual void SetVibration(DeviceIdType deviceId, uint8 largeMotor, uint8 smallMotor){};
2018-11-28 22:32:27 -05:00
using OnInputSignal = Framework::CSignal<void(const BINDINGTARGET&, uint32)>;
using OnInputSignalConnection = OnInputSignal::Connection;
OnInputSignal OnInput;
};