YARP
Yet Another Robot Platform
FrameTransformGet_nwc_yarp.cpp
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3  * SPDX-License-Identifier: BSD-3-Clause
4  */
5 
7 
8 #include <yarp/os/LogComponent.h>
9 #include <yarp/os/LogStream.h>
10 
11 YARP_LOG_COMPONENT(FRAMETRANSFORMGETNWCYARP, "yarp.devices.FrameTransformGet_nwc_yarp")
12 
13 
14 bool FrameTransformGet_nwc_yarp::open(yarp::os::Searchable& config)
15 {
17  yCError(FRAMETRANSFORMGETNWCYARP,"Error! YARP Network is not initialized");
18  return false;
19  }
20  std::string prefix;
21  //checking default config params
22  bool default_config = true;
23  if(config.check("default-client")) {
24  default_config = config.find("default-client").asString() == "true";
25  }
26  bool default_server = true;
27  if(config.check("default-server")) {
28  default_server = config.find("default-server").asString() == "true";
29  }
30  // client port configuration
31  if (config.check("nwc_thrift_port_prefix")){
32  prefix = config.find("nwc_thrift_port_prefix").asString() + (default_config ? m_defaultConfigPrefix : "");
33  if(prefix[0] != '/') {prefix = "/"+prefix;}
34  m_thrift_rpcPort_Name = prefix + "/" + m_deviceName + "/thrift";
35  }
36  else {
37  prefix = default_config ? m_defaultConfigPrefix : "";
38  m_thrift_rpcPort_Name = prefix + "/" + m_deviceName + "/thrift";
39  yCWarning(FRAMETRANSFORMGETNWCYARP) << "no nwc_thrift_port_prefix param found. The resulting port name will be: " << m_thrift_rpcPort_Name;
40  }
41 
42  //server port configuration
43  if (config.check("nws_thrift_port_prefix")){
44  prefix = config.find("nws_thrift_port_prefix").asString() + (default_server ? m_defaultServerPrefix : "");
45  if(prefix[0] != '/') {prefix = "/"+prefix;}
46  m_thrift_server_rpcPort_Name = prefix + "/thrift";
47  }
48  else {
49  prefix = default_server ? m_defaultServerPrefix : "";
50  m_thrift_server_rpcPort_Name = prefix + "/thrift";
51  yCWarning(FRAMETRANSFORMGETNWCYARP) << "no nws_thrift_port_prefix param found. The resulting port name will be: " << m_thrift_server_rpcPort_Name;
52  }
53  // rpc inizialisation
54  if(!m_thrift_rpcPort.open(m_thrift_rpcPort_Name))
55  {
56  yCError(FRAMETRANSFORMGETNWCYARP,"Could not open \"%s\" port",m_thrift_rpcPort_Name.c_str());
57  return false;
58  }
59  // connect to server
60  if (!yarp::os::NetworkBase::connect(m_thrift_rpcPort_Name,m_thrift_server_rpcPort_Name))
61  {
62  yCError(FRAMETRANSFORMGETNWCYARP,"Could not connect \"%s\" to \"%s\" port",m_thrift_rpcPort_Name.c_str(), m_thrift_server_rpcPort_Name.c_str());
63  return false;
64  }
65  if (!m_frameTransformStorageGetRPC.yarp().attachAsClient(m_thrift_rpcPort))
66  {
67  yCError(FRAMETRANSFORMGETNWCYARP, "Error! Cannot attach the port as a client");
68  return false;
69  }
70 
71  //checking streaming_enabled param
72  if(config.check("streaming_enabled")) {
73  m_streaming_port_enabled = config.find("streaming_enabled").asString() == "true";
74  }
75 
76  if (m_streaming_port_enabled)
77  {
78  yCInfo(FRAMETRANSFORMGETNWCYARP) << "Receiving transforms from Yarp port enabled";
79  if (config.check("input_streaming_port_prefix")){
80  prefix = config.find("input_streaming_port_prefix").asString() + (default_config ? m_defaultConfigPrefix : "");
81  if(prefix[0] != '/') {prefix = "/"+prefix;}
82  m_streaming_input_port_name = prefix + "/" + m_deviceName + "/tf:i";
83  }
84  else {
85  prefix = default_config ? m_defaultConfigPrefix : "";
86  m_streaming_input_port_name = prefix + "/" + m_deviceName + "/tf:i";
87  yCWarning(FRAMETRANSFORMGETNWCYARP) << "no input_streaming_port_prefix param found. The resulting port name will be: " << m_streaming_input_port_name;
88  }
89 
90  //server port configuration
91  if (config.check("output_streaming_port_prefix")){
92  prefix = config.find("output_streaming_port_prefix").asString() + (default_server ? m_defaultServerPrefix : "");
93  if(prefix[0] != '/') {prefix = "/"+prefix;}
94  m_streaming_output_port_name = prefix + "/tf:o";
95  }
96  else {
97  prefix = default_server ? m_defaultServerPrefix : "";
98  m_streaming_output_port_name = prefix + "/tf:o";
99  yCWarning(FRAMETRANSFORMGETNWCYARP) << "no output_streaming_port_prefix param found. The resulting port name will be: " << m_streaming_output_port_name;
100  }
101 
102  // data receiver initialization
103  m_dataReader = new FrameTransformGet_nwc_yarp::DataReader();
104  if(!m_dataReader->open(m_streaming_input_port_name))
105  {
106  yCError(FRAMETRANSFORMGETNWCYARP,"Could not open \"%s\" port",m_streaming_input_port_name.c_str());
107  return false;
108  }
109  // connect to server
110  if (!yarp::os::NetworkBase::connect(m_streaming_output_port_name,m_streaming_input_port_name))
111  {
112  yCError(FRAMETRANSFORMGETNWCYARP,"Could not connect \"%s\" to \"%s\" port",m_streaming_output_port_name.c_str(), m_streaming_input_port_name.c_str());
113  return false;
114  }
115  //useCallback
116  m_dataReader->useCallback();
117  }
118  else
119  {
120  yCInfo(FRAMETRANSFORMGETNWCYARP) << "Receiving transforms from Yarp port NOT enabled";
121  }
122 
123  return true;
124 }
125 
126 
128 {
129  if (m_streaming_port_enabled)
130  {
131  m_dataReader->interrupt();
132  m_dataReader->close();
133  }
134  m_thrift_rpcPort.close();
135  return true;
136 }
137 
138 
139 bool FrameTransformGet_nwc_yarp::getTransforms(std::vector<yarp::math::FrameTransform>& transforms) const
140 {
141  if (!m_streaming_port_enabled)
142  {
143  return_getAllTransforms retrievedFromRPC = m_frameTransformStorageGetRPC.getTransformsRPC();
144  if(!retrievedFromRPC.retvalue)
145  {
146  yCError(FRAMETRANSFORMGETNWCYARP, "Unable to get transformations");
147  return false;
148  }
149  transforms = retrievedFromRPC.transforms_list;
150  return true;
151  }
152  else
153  {
154  if (m_dataReader)
155  {
156  return_getAllTransforms retrievedFromSteaming;
157  m_dataReader->getData(retrievedFromSteaming);
158  transforms = retrievedFromSteaming.transforms_list;
159  return true;
160  }
161  yCError(FRAMETRANSFORMGETNWCYARP, "Unable to get transformations");
162  return false;
163  }
164 }
165 
166 bool FrameTransformGet_nwc_yarp::DataReader::getData(return_getAllTransforms& data)
167 {
168  m_mutex.lock();
169  data = m_Transforms;
170  m_mutex.unlock();
171  return true;
172 }
173 
175 {
176  m_mutex.lock();
177  m_Transforms = v;
178  m_mutex.unlock();
179 }
const yarp::os::LogComponent & FRAMETRANSFORMGETNWCYARP()
frameTransformGet_nwc_yarp: A network wrapper client which converts the input retrieved from a FrameT...
bool getTransforms(std::vector< yarp::math::FrameTransform > &transforms) const override
Obtains all frame transforms saved in a storage.
bool close() override
Close the DeviceDriver.
virtual return_getAllTransforms getTransformsRPC()
std::vector< yarp::math::FrameTransform > transforms_list
void onRead(return_getAllTransforms &datum) override
Callback method.
static bool connect(const std::string &src, const std::string &dest, const std::string &carrier="", bool quiet=true)
Request that an output port connect to an input port.
Definition: Network.cpp:682
static bool checkNetwork()
Check if the YARP Network is up and running.
Definition: Network.cpp:1377
void close() override
Stop port activity.
Definition: Port.cpp:354
#define yCInfo(component,...)
Definition: LogComponent.h:132
#define yCError(component,...)
Definition: LogComponent.h:154
#define yCWarning(component,...)
Definition: LogComponent.h:143
#define YARP_LOG_COMPONENT(name,...)
Definition: LogComponent.h:77
The main, catch-all namespace for YARP.
Definition: dirs.h:16