forked from dolphin-emu/dolphin
		
	
		
			
	
	
		
			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
							 |