10
// idk in case I wanted to change it to double or something, idk what's best
11
typedef float ControlState;
18
// Forward declarations
19
class DeviceQualifier;
35
// control includes inputs and outputs
37
class Control // input or output
40
virtual std::string GetName() const = 0;
43
virtual Input* ToInput() { return NULL; }
44
virtual Output* ToOutput() { return NULL; }
50
// an input on a device
52
class Input : public Control
55
// things like absolute axes/ absolute mouse position will override this
56
virtual bool IsDetectable() { return true; }
58
virtual ControlState GetState() const = 0;
60
Input* ToInput() { return this; }
66
// an output on a device
68
class Output : public Control
73
virtual void SetState(ControlState state) = 0;
75
Output* ToOutput() { return this; }
80
virtual std::string GetName() const = 0;
81
virtual int GetId() const = 0;
82
virtual std::string GetSource() const = 0;
83
virtual bool UpdateInput() = 0;
84
virtual bool UpdateOutput() = 0;
86
virtual void ClearInputState();
88
const std::vector<Input*>& Inputs() const { return m_inputs; }
89
const std::vector<Output*>& Outputs() const { return m_outputs; }
91
Input* FindInput(const std::string& name) const;
92
Output* FindOutput(const std::string& name) const;
95
void AddInput(Input* const i);
96
void AddOutput(Output* const o);
98
class FullAnalogSurface : public Input
101
FullAnalogSurface(Input* low, Input* high)
102
: m_low(*low), m_high(*high)
105
ControlState GetState() const
107
return (1 + m_high.GetState() - m_low.GetState()) / 2;
110
std::string GetName() const
112
return m_low.GetName() + *m_high.GetName().rbegin();
120
void AddAnalogInputs(Input* low, Input* high)
124
AddInput(new FullAnalogSurface(low, high));
125
AddInput(new FullAnalogSurface(high, low));
129
std::vector<Input*> m_inputs;
130
std::vector<Output*> m_outputs;
136
// device qualifier used to match devices
137
// currently has ( source, id, name ) properties which match a device
139
class DeviceQualifier
142
DeviceQualifier() : cid(-1) {}
143
DeviceQualifier(const std::string& _source, const int _id, const std::string& _name)
144
: source(_source), cid(_id), name(_name) {}
145
void FromDevice(const Device* const dev);
146
void FromString(const std::string& str);
147
std::string ToString() const;
148
bool operator==(const DeviceQualifier& devq) const;
149
bool operator==(const Device* const dev) const;
156
class DeviceContainer
159
Device::Input* FindInput(const std::string& name, const Device* def_dev) const;
160
Device::Output* FindOutput(const std::string& name, const Device* def_dev) const;
162
const std::vector<Device*>& Devices() const { return m_devices; }
163
Device* FindDevice(const DeviceQualifier& devq) const;
165
std::vector<Device*> m_devices;