denso_variable.cpp
Go to the documentation of this file.
1 
26 
27 namespace denso_robot_core
28 {
29 DensoVariable::DensoVariable(DensoBase* parent, Service_Vec& service, Handle_Vec& handle, const std::string& name,
30  const int* mode, int16_t vt, bool Read, bool Write, bool ID, int Duration)
31  : DensoBase(parent, service, handle, name, mode), m_vt(vt), m_bRead(Read), m_bWrite(Write), m_bID(ID)
32 {
33  m_Duration = ros::Duration(Duration / 1000, (Duration % 1000) * 1000);
35 }
36 
38 {
39 }
40 
42 {
43  if (*m_mode != 0)
44  {
45  return S_FALSE;
46  }
47 
48  // Message name
49  std::string tmpName = m_parent->RosName();
50  if (tmpName != "")
51  tmpName.append("/");
52  tmpName.append(DensoBase::RosName());
53 
54  if (m_bRead)
55  {
56  switch (m_vt)
57  {
58  case VT_I4:
59  m_pubValue = node.advertise<Int32>(tmpName + NAME_READ, MESSAGE_QUEUE);
60  break;
61  case VT_R4:
62  m_pubValue = node.advertise<Float32>(tmpName + NAME_READ, MESSAGE_QUEUE);
63  break;
64  case VT_R8:
65  m_pubValue = node.advertise<Float64>(tmpName + NAME_READ, MESSAGE_QUEUE);
66  break;
67  case VT_BSTR:
68  m_pubValue = node.advertise<String>(tmpName + NAME_READ, MESSAGE_QUEUE);
69  break;
70  case VT_BOOL:
71  m_pubValue = node.advertise<Bool>(tmpName + NAME_READ, MESSAGE_QUEUE);
72  break;
73  case (VT_ARRAY | VT_R4):
74  m_pubValue = node.advertise<Float32MultiArray>(tmpName + NAME_READ, MESSAGE_QUEUE);
75  break;
76  case (VT_ARRAY | VT_R8):
77  m_pubValue = node.advertise<Float64MultiArray>(tmpName + NAME_READ, MESSAGE_QUEUE);
78  break;
79  default:
80  return E_FAIL;
81  }
82  }
83 
84  if (m_bWrite)
85  {
86  switch (m_vt)
87  {
88  case VT_I4:
90  break;
91  case VT_R4:
92  m_subValue = node.subscribe<Float32>(tmpName + NAME_WRITE, MESSAGE_QUEUE, &DensoVariable::Callback_F32, this);
93  break;
94  case VT_R8:
95  m_subValue = node.subscribe<Float64>(tmpName + NAME_WRITE, MESSAGE_QUEUE, &DensoVariable::Callback_F64, this);
96  break;
97  case VT_BSTR:
99  break;
100  case VT_BOOL:
102  break;
103  case (VT_ARRAY | VT_R4):
104  m_subValue = node.subscribe<Float32MultiArray>(tmpName + NAME_WRITE, MESSAGE_QUEUE,
106  break;
107  case (VT_ARRAY | VT_R8):
108  m_subValue = node.subscribe<Float64MultiArray>(tmpName + NAME_WRITE, MESSAGE_QUEUE,
110  break;
111  default:
112  return E_FAIL;
113  }
114  }
115 
116  if (m_bID)
117  {
118  m_subID = node.subscribe<Int32>(tmpName + NAME_ID, MESSAGE_QUEUE, &DensoVariable::Callback_ID, this);
119  }
120 
121  m_serving = true;
122 
123  return S_OK;
124 }
125 
127 {
128  m_mtxSrv.lock();
129  m_serving = false;
130  m_mtxSrv.unlock();
131 
134  m_subID.shutdown();
135  return S_OK;
136 }
137 
139 {
140  boost::mutex::scoped_lock lockSrv(m_mtxSrv);
141  if (!m_serving)
142  return false;
143 
144  if (m_bRead)
145  {
146  HRESULT hr;
147 
148  Int32 varI;
149  Float32 varF;
150  Float64 varD;
151  String varS;
152  Bool varIO;
153  Float32MultiArray varFArray;
154  Float64MultiArray varDArray;
155 
156  uint32_t num;
157  float* pfltval;
158  double* pdblval;
159 
160  ros::Time pubTimeCur = ros::Time::now();
161 
162  if (pubTimeCur - m_pubTimePrev > m_Duration)
163  {
164  VARIANT_Ptr vntRet(new VARIANT());
165  VariantInit(vntRet.get());
166 
167  hr = ExecGetValue(vntRet);
168  if (SUCCEEDED(hr))
169  {
170  if (vntRet->vt == m_vt)
171  {
172  switch (m_vt)
173  {
174  case VT_I4:
175  varI.data = vntRet->lVal;
176  m_pubValue.publish(varI);
177  break;
178  case VT_R4:
179  varF.data = vntRet->fltVal;
180  m_pubValue.publish(varF);
181  break;
182  case VT_R8:
183  varD.data = vntRet->dblVal;
184  m_pubValue.publish(varD);
185  break;
186  case VT_BSTR:
187  varS.data = ConvertBSTRToString(vntRet->bstrVal);
188  m_pubValue.publish(varS);
189  break;
190  case VT_BOOL:
191  varIO.data = (vntRet->boolVal != VARIANT_FALSE) ? true : false;
192  m_pubValue.publish(varIO);
193  break;
194  case (VT_ARRAY | VT_R4):
195  num = vntRet->parray->rgsabound->cElements;
196  SafeArrayAccessData(vntRet->parray, (void**)&pfltval);
197  varFArray.data.resize(num);
198  std::copy(pfltval, &pfltval[num], varFArray.data.begin());
199  SafeArrayUnaccessData(vntRet->parray);
200  m_pubValue.publish(varFArray);
201  break;
202  case (VT_ARRAY | VT_R8):
203  num = vntRet->parray->rgsabound->cElements;
204  SafeArrayAccessData(vntRet->parray, (void**)&pdblval);
205  varDArray.data.resize(num);
206  std::copy(pdblval, &pdblval[num], varDArray.data.begin());
207  SafeArrayUnaccessData(vntRet->parray);
208  m_pubValue.publish(varDArray);
209  break;
210  }
211  }
212  }
213 
214  m_pubTimePrev = pubTimeCur;
215  }
216  }
217 
218  return true;
219 }
220 
222 {
223  VARIANT_Vec vntArgs;
224  VARIANT_Ptr vntHandle(new VARIANT());
225 
226  VariantInit(vntHandle.get());
227 
228  vntHandle->vt = VT_UI4;
229  vntHandle->ulVal = m_vecHandle[DensoBase::SRV_WATCH];
230 
231  vntArgs.push_back(*vntHandle.get());
232 
233  return m_vecService[DensoBase::SRV_WATCH]->ExecFunction(ID_VARIABLE_GETVALUE, vntArgs, value);
234 }
235 
237 {
238  HRESULT hr;
239  int argc;
240  VARIANT_Vec vntArgs;
241  VARIANT_Ptr vntHandle(new VARIANT());
242  VARIANT_Ptr vntRet(new VARIANT());
243 
244  VariantInit(vntRet.get());
245 
246  vntHandle->vt = VT_UI4;
247  vntHandle->ulVal = m_vecHandle[DensoBase::SRV_WATCH];
248 
249  vntArgs.push_back(*vntHandle.get());
250 
251  vntArgs.push_back(*value.get());
252 
253  hr = m_vecService[DensoBase::SRV_WATCH]->ExecFunction(ID_VARIABLE_PUTVALUE, vntArgs, vntRet);
254  if (SUCCEEDED(hr))
255  {
256  Update();
257  }
258 
259  return hr;
260 }
261 
263 {
264  HRESULT hr;
265  int argc;
266  VARIANT_Vec vntArgs;
267  VARIANT_Ptr vntHandle(new VARIANT());
268  VARIANT_Ptr vntValue(new VARIANT());
269  VARIANT_Ptr vntRet(new VARIANT());
270 
271  VariantInit(vntRet.get());
272 
273  vntHandle->vt = VT_UI4;
274  vntHandle->ulVal = m_vecHandle[DensoBase::SRV_WATCH];
275 
276  vntArgs.push_back(*vntHandle.get());
277 
278  vntValue->vt = VT_I4;
279  vntValue->lVal = id;
280  vntArgs.push_back(*vntValue.get());
281 
282  hr = m_vecService[DensoBase::SRV_WATCH]->ExecFunction(ID_VARIABLE_PUTID, vntArgs, vntRet);
283  if (SUCCEEDED(hr))
284  {
285  Update();
286  }
287 
288  return hr;
289 }
290 
291 void DensoVariable::Callback_I32(const Int32::ConstPtr& msg)
292 {
293  VARIANT_Ptr vntVal(new VARIANT());
294  vntVal->vt = VT_I4;
295  vntVal->lVal = msg->data;
296 
297  ExecPutValue(vntVal);
298 }
299 
300 void DensoVariable::Callback_F32(const Float32::ConstPtr& msg)
301 {
302  VARIANT_Ptr vntVal(new VARIANT());
303  vntVal->vt = VT_R4;
304  vntVal->fltVal = msg->data;
305 
306  ExecPutValue(vntVal);
307 }
308 
309 void DensoVariable::Callback_F64(const Float64::ConstPtr& msg)
310 {
311  VARIANT_Ptr vntVal(new VARIANT());
312  vntVal->vt = VT_R8;
313  vntVal->dblVal = msg->data;
314 
315  ExecPutValue(vntVal);
316 }
317 
318 void DensoVariable::Callback_String(const String::ConstPtr& msg)
319 {
320  VARIANT_Ptr vntVal(new VARIANT());
321  vntVal->vt = VT_BSTR;
322  vntVal->bstrVal = ConvertStringToBSTR(msg->data);
323 
324  ExecPutValue(vntVal);
325 }
326 
327 void DensoVariable::Callback_Bool(const Bool::ConstPtr& msg)
328 {
329  VARIANT_Ptr vntVal(new VARIANT());
330  vntVal->vt = VT_BOOL;
331  vntVal->boolVal = (msg->data != 0) ? VARIANT_TRUE : VARIANT_FALSE;
332 
333  ExecPutValue(vntVal);
334 }
335 
336 void DensoVariable::Callback_F32Array(const Float32MultiArray::ConstPtr& msg)
337 {
338  VARIANT_Ptr vntVal(new VARIANT());
339  float* pval;
340 
341  vntVal->vt = (VT_ARRAY | VT_R4);
342  vntVal->parray = SafeArrayCreateVector(VT_R4, 0, msg->data.size());
343 
344  SafeArrayAccessData(vntVal->parray, (void**)&pval);
345  std::copy(msg->data.begin(), msg->data.end(), pval);
346  SafeArrayUnaccessData(vntVal->parray);
347 
348  ExecPutValue(vntVal);
349 }
350 
351 void DensoVariable::Callback_F64Array(const Float64MultiArray::ConstPtr& msg)
352 {
353  VARIANT_Ptr vntVal(new VARIANT());
354  double* pval;
355 
356  vntVal->vt = (VT_ARRAY | VT_R8);
357  vntVal->parray = SafeArrayCreateVector(VT_R8, 0, msg->data.size());
358 
359  SafeArrayAccessData(vntVal->parray, (void**)&pval);
360  std::copy(msg->data.begin(), msg->data.end(), pval);
361  SafeArrayUnaccessData(vntVal->parray);
362 
363  ExecPutValue(vntVal);
364 }
365 
366 void DensoVariable::Callback_ID(const Int32::ConstPtr& msg)
367 {
368  ExecPutID(msg->data);
369 }
370 
371 } // namespace denso_robot_core
#define S_FALSE
HRESULT SafeArrayUnaccessData(SAFEARRAY *psa)
#define ID_VARIABLE_GETVALUE
short int16_t
unsigned uint32_t
SAFEARRAY * SafeArrayCreateVector(uint16_t vt, int32_t lLbound, uint32_t cElements)
#define VARIANT_TRUE
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
#define S_OK
HRESULT ExecPutValue(const VARIANT_Ptr &value)
void Callback_F32Array(const Float32MultiArray::ConstPtr &msg)
void Callback_ID(const Int32::ConstPtr &msg)
std::vector< VARIANT, VariantAllocator< VARIANT > > VARIANT_Vec
std::vector< uint32_t > Handle_Vec
Definition: denso_base.h:67
VT_I4
HRESULT ExecPutID(const int id)
VT_BSTR
HRESULT StartService(ros::NodeHandle &node)
std::vector< BCAPService_Ptr > Service_Vec
Definition: denso_base.h:68
void Callback_I32(const Int32::ConstPtr &msg)
void VariantInit(VARIANT *pvarg)
void publish(const boost::shared_ptr< M > &message) const
#define E_FAIL
int32_t HRESULT
std::string RosName() const
Definition: denso_base.cpp:61
static constexpr const char * NAME_ID
void Callback_String(const String::ConstPtr &msg)
#define MESSAGE_QUEUE
Definition: denso_base.h:61
VT_ARRAY
VT_BOOL
static std::string ConvertBSTRToString(const BSTR bstr)
Definition: denso_base.cpp:31
VT_UI4
boost::interprocess::unique_ptr< VARIANT, variant_deleter > VARIANT_Ptr
HRESULT ExecGetValue(VARIANT_Ptr &value)
HRESULT SafeArrayAccessData(SAFEARRAY *psa, void **ppvData)
static BSTR ConvertStringToBSTR(const std::string &str)
Definition: denso_base.cpp:46
#define SUCCEEDED(hr)
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
void Callback_F32(const Float32::ConstPtr &msg)
VT_R8
#define ID_VARIABLE_PUTVALUE
DensoVariable(DensoBase *parent, Service_Vec &service, Handle_Vec &handle, const std::string &name, const int *mode, int16_t vt, bool Read, bool Write, bool ID, int Duration)
static constexpr const char * NAME_READ
#define VARIANT_FALSE
static constexpr const char * NAME_WRITE
static Time now()
VT_R4
void Callback_F64Array(const Float64MultiArray::ConstPtr &msg)
void Callback_Bool(const Bool::ConstPtr &msg)
void Callback_F64(const Float64::ConstPtr &msg)
#define ID_VARIABLE_PUTID


denso_robot_core
Author(s): DENSO WAVE INCORPORATED
autogenerated on Sat Feb 18 2023 04:06:02