libqi-api  release-2.5.3-2016-11-18
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
proxysignal.hpp
Go to the documentation of this file.
1 #pragma once
2 /*
3 ** Copyright (C) 2013 Aldebaran Robotics
4 ** See COPYING for the license
5 */
6 
7 #ifndef _QI_TYPE_PROXYSIGNAL_HPP_
8 #define _QI_TYPE_PROXYSIGNAL_HPP_
9 
10 #include <qi/signal.hpp>
11 #include <qi/anyfunction.hpp>
12 
13 namespace qi
14 {
15 
17  template<typename T>
18  class ProxySignal: public SignalF<T>
19  {
20  public:
22  ProxySignal(AnyObject object, const std::string& signalName)
23  : SignalType()
24  {
25  setup(object, signalName);
26  }
28  ~ProxySignal();
29  void setup(AnyObject object, const std::string& signalName)
30  {
32  object.asGenericObject(), signalName, SignalBase::invalidSignalLink));
34  object.asGenericObject(), signalName));
35  }
36  void onSubscribe(bool enable, GenericObject* object, std::string signalName, SignalLink link);
38  void triggerOverride(const GenericFunctionParameters& params,
39  MetaCallType callType, GenericObject* object, std::string signalName);
40  };
41 
42  template<typename T>
43  void makeProxySignal(SignalF<T>& target, AnyObject object, const std::string& signalName)
44  {
45  ProxySignal<T>& proxy = static_cast<ProxySignal<T> &>(target);
46  proxy.setup(object, signalName);
47  }
48 
49  template<typename T>
50  void makeProxySignal(ProxySignal<T>& target, AnyObject object, const std::string& signalName)
51  {
52  target.setup(object, signalName);
53  }
54 
55  template<typename T>
57  {
58  SignalType::disconnectAll(); // will invoke onsubscribe
59  }
60 
61  template<typename T>
62  void ProxySignal<T>::onSubscribe(bool enable, GenericObject* object, std::string signalName,
63  SignalLink link)
64  {
65  if (enable)
66  {
67  link = object->connect(signalName,
70  ));
71  }
72  else
73  {
74  bool ok = !object->disconnect(link).hasError();
75  if (!ok)
76  qiLogError("qitype.proxysignal") << "Failed to disconnect from parent signal";
78  }
79  // link change, rebind ourselve
81  object, signalName, link));
82  }
83 
84  template<typename T>
86  {
87  // Trigger on our signal, bypassing our trigger overload
88  SignalType::callSubscribers(args);
89  return AnyReference(typeOf<void>());
90  }
91 
92  template<typename T>
94  GenericObject* object, std::string signalName)
95  {
96  // Just forward to backend, which will notify us in bouceEvent(),
97  // and then we will notify our local Subscribers
98  object->metaPost(signalName, params);
99  }
100 
101 }
102 
103 
104 
105 #endif // _QITYPE_PROXYSIGNAL_HPP_
static const SignalLink invalidSignalLink
Definition: signal.hpp:103
void setOnSubscribers(OnSubscribers onSubscribers)
ProxySignal(AnyObject object, const std::string &signalName)
Definition: proxysignal.hpp:22
void setTriggerOverride(Trigger trigger)
#define qiLogError(...)
Log in error mode.
Definition: log.hpp:112
Signal proxy, using an AnyObject and signal id as backend.
Definition: proxysignal.hpp:18
std::vector< AnyReference > AnyReferenceVector
MetaCallType
Definition: typeobject.hpp:21
static AnyFunction fromDynamicFunction(DynamicFunction f)
void onSubscribe(bool enable, GenericObject *object, std::string signalName, SignalLink link)
Definition: proxysignal.hpp:62
AnyReference bounceEvent(const AnyReferenceVector args)
Definition: proxysignal.hpp:85
void makeProxySignal(SignalF< T > &target, AnyObject object, const std::string &signalName)
Definition: proxysignal.hpp:43
qi::uint64_t SignalLink
Definition: signal.hpp:35
void setup(AnyObject object, const std::string &signalName)
Definition: proxysignal.hpp:29
std::enable_if< std::is_function< RF >::value, boost::function< RF > >::type bind(AF &&fun, Arg0 &&arg0, Args &&...args)
Definition: trackable.hxx:327
void triggerOverride(const GenericFunctionParameters &params, MetaCallType callType, GenericObject *object, std::string signalName)
Definition: proxysignal.hpp:93