12 #ifndef hifi_Controllers_Endpoint_h
13 #define hifi_Controllers_Endpoint_h
19 #include <QtCore/QObject>
21 #include "../AxisValue.h"
25 namespace controller {
32 class Endpoint :
public QObject,
public std::enable_shared_from_this<Endpoint> {
35 using Pointer = std::shared_ptr<Endpoint>;
36 using List = std::list<Pointer>;
37 using Pair = std::pair<Pointer, Pointer>;
38 using ReadLambda = std::function<float()>;
39 using WriteLambda = std::function<void(
float)>;
41 virtual AxisValue value() {
return peek(); }
42 virtual AxisValue peek()
const = 0;
43 virtual void apply(AxisValue value,
const Pointer& source) = 0;
44 virtual Pose peekPose()
const {
return Pose(); };
45 virtual Pose pose() {
return peekPose(); }
46 virtual void apply(
const Pose& value,
const Pointer& source) {}
47 virtual bool isPose()
const {
return _input.isPose(); }
48 virtual bool writeable()
const {
return true; }
49 virtual bool readable()
const {
return true; }
50 virtual void reset() { }
52 const Input& getInput() {
return _input; }
55 Endpoint(
const Input& input) : _input(input) {}
59 class LambdaEndpoint :
public Endpoint {
61 using Endpoint::apply;
63 virtual AxisValue peek()
const override {
return AxisValue(_readLambda(), 0); }
64 virtual void apply(AxisValue value,
const Pointer& source)
override { _writeLambda(value.value); }
67 LambdaEndpoint(ReadLambda readLambda, WriteLambda writeLambda = [](
float) {})
68 : Endpoint(Input::INVALID_INPUT), _readLambda(readLambda), _writeLambda(writeLambda) { }
70 ReadLambda _readLambda;
71 WriteLambda _writeLambda;
74 extern Endpoint::WriteLambda DEFAULT_WRITE_LAMBDA;
76 class LambdaRefEndpoint :
public Endpoint {
78 static std::shared_ptr<Endpoint> newEndpoint(
const ReadLambda& readLambda,
const WriteLambda& writeLambda = DEFAULT_WRITE_LAMBDA) {
79 return std::shared_ptr<Endpoint>(
new LambdaRefEndpoint(readLambda, writeLambda));
82 using Endpoint::apply;
84 virtual AxisValue peek()
const override {
return AxisValue(_readLambda(), 0); }
85 virtual void apply(AxisValue value,
const Pointer& source)
override { _writeLambda(value.value); }
88 LambdaRefEndpoint(
const ReadLambda& readLambda,
const WriteLambda& writeLambda = DEFAULT_WRITE_LAMBDA)
89 : Endpoint(Input::INVALID_INPUT), _readLambda(readLambda), _writeLambda(writeLambda) {
92 const ReadLambda& _readLambda;
93 const WriteLambda& _writeLambda;
97 class VirtualEndpoint :
public Endpoint {
99 virtual AxisValue peek()
const override {
return _currentValue; }
100 virtual void apply(AxisValue value,
const Pointer& source)
override { _currentValue = value; }
102 virtual Pose peekPose()
const override {
return _currentPose; }
103 virtual void apply(
const Pose& value,
const Pointer& source)
override {
104 _currentPose = value;
107 VirtualEndpoint(
const Input&
id = Input::INVALID_INPUT)
111 AxisValue _currentValue { 0.0f, 0,
false };
112 Pose _currentPose {};