diff options
| author | Jasper St. Pierre <jstpierre@mecheye.net> | 2013-06-16 20:07:10 -0400 |
|---|---|---|
| committer | Jasper St. Pierre <jstpierre@mecheye.net> | 2013-06-25 00:58:30 -0400 |
| commit | 877106b027431c6edb2d2c702fa6d811dac3d250 (patch) | |
| tree | a0d83be190efea7ad4915db7db9ac40f9192b251 /Source/Core/InputCommon/Src/ControllerInterface/Device.h | |
| parent | 143d2eccb49b700ccd00dfa229b03d1d1a51533c (diff) | |
InputCommon: Split Device stuff out
The ExpressionParser needs this to be out of here to prevent issues
with cyclic references.
Diffstat (limited to 'Source/Core/InputCommon/Src/ControllerInterface/Device.h')
| -rw-r--r-- | Source/Core/InputCommon/Src/ControllerInterface/Device.h | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/Source/Core/InputCommon/Src/ControllerInterface/Device.h b/Source/Core/InputCommon/Src/ControllerInterface/Device.h new file mode 100644 index 0000000000..a7c26b867d --- /dev/null +++ b/Source/Core/InputCommon/Src/ControllerInterface/Device.h @@ -0,0 +1,171 @@ + +#ifndef _DEVICE_H_ +#define _DEVICE_H_ + +#include <string> +#include <vector> + +#include "Common.h" + +// idk in case I wanted to change it to double or something, idk what's best +typedef float ControlState; + +namespace ciface +{ +namespace Core +{ + +// Forward declarations +class DeviceQualifier; + +// +// Device +// +// a device class +// +class Device +{ +public: + class Input; + class Output; + + // + // Control + // + // control includes inputs and outputs + // + class Control // input or output + { + public: + virtual std::string GetName() const = 0; + virtual ~Control() {} + + virtual Input* ToInput() { return NULL; } + virtual Output* ToOutput() { return NULL; } + }; + + // + // Input + // + // an input on a device + // + class Input : public Control + { + public: + // things like absolute axes/ absolute mouse position will override this + virtual bool IsDetectable() { return true; } + + virtual ControlState GetState() const = 0; + + Input* ToInput() { return this; } + }; + + // + // Output + // + // an output on a device + // + class Output : public Control + { + public: + virtual ~Output() {} + + virtual void SetState(ControlState state) = 0; + + Output* ToOutput() { return this; } + }; + + virtual ~Device(); + + virtual std::string GetName() const = 0; + virtual int GetId() const = 0; + virtual std::string GetSource() const = 0; + virtual bool UpdateInput() = 0; + virtual bool UpdateOutput() = 0; + + virtual void ClearInputState(); + + const std::vector<Input*>& Inputs() const { return m_inputs; } + const std::vector<Output*>& Outputs() const { return m_outputs; } + + Input* FindInput(const std::string& name) const; + Output* FindOutput(const std::string& name) const; + +protected: + void AddInput(Input* const i); + void AddOutput(Output* const o); + + class FullAnalogSurface : public Input + { + public: + FullAnalogSurface(Input* low, Input* high) + : m_low(*low), m_high(*high) + {} + + ControlState GetState() const + { + return (1 + m_high.GetState() - m_low.GetState()) / 2; + } + + std::string GetName() const + { + return m_low.GetName() + *m_high.GetName().rbegin(); + } + + private: + Input& m_low; + Input& m_high; + }; + + void AddAnalogInputs(Input* low, Input* high) + { + AddInput(low); + AddInput(high); + AddInput(new FullAnalogSurface(low, high)); + AddInput(new FullAnalogSurface(high, low)); + } + +private: + std::vector<Input*> m_inputs; + std::vector<Output*> m_outputs; +}; + +// +// DeviceQualifier +// +// device qualifier used to match devices +// currently has ( source, id, name ) properties which match a device +// +class DeviceQualifier +{ +public: + DeviceQualifier() : cid(-1) {} + DeviceQualifier(const std::string& _source, const int _id, const std::string& _name) + : source(_source), cid(_id), name(_name) {} + void FromDevice(const Device* const dev); + void FromString(const std::string& str); + std::string ToString() const; + bool operator==(const DeviceQualifier& devq) const; + bool operator==(const Device* const dev) const; + + std::string source; + int cid; + std::string name; +}; + +class DeviceContainer +{ +public: + Device::Input* FindInput(const std::string& name, const Device* def_dev) const; + Device::Output* FindOutput(const std::string& name, const Device* def_dev) const; + + const std::vector<Device*>& Devices() const { return m_devices; } + Device* FindDevice(const DeviceQualifier& devq) const; +protected: + std::vector<Device*> m_devices; +}; + +} +} + +#endif |
