172 lines
3.3 KiB
C++
172 lines
3.3 KiB
C++
|
|
#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
|