denso_controller.cpp
Go to the documentation of this file.
1 
26 
27 namespace denso_robot_core
28 {
29 DensoController::DensoController(const std::string& name, const int* mode, const ros::Duration dt)
30  : DensoBase(name, mode), m_duration(dt)
31 {
32  for (int srvs = DensoBase::SRV_MIN; srvs <= DensoBase::SRV_MAX; srvs++)
33  {
34  BCAPService_Ptr service = boost::make_shared<bcap_service::BCAPService>();
35  service->parseParams();
36  switch (srvs)
37  {
38  case DensoBase::SRV_ACT:
39  service->put_Type("udp");
40  break;
41  default:
42  service->put_Type("tcp");
43  break;
44  }
45  m_vecService.push_back(service);
46  }
47 }
48 
50 {
51 }
52 
53 HRESULT DensoController::InitializeBCAP(const std::string& filename)
54 {
55  HRESULT hr;
56  XMLError ret;
57  XMLDocument xmlDoc;
58  XMLElement *xmlCtrl, *xmlRob, *xmlTsk;
59 
60  for (int srvs = DensoBase::SRV_MIN; srvs <= DensoBase::SRV_MAX; srvs++)
61  {
62  hr = m_vecService[srvs]->Connect();
63  if (FAILED(hr))
64  return hr;
65  }
66 
67  ret = xmlDoc.LoadFile(filename.c_str());
68  if (ret != XML_SUCCESS)
69  return E_FAIL;
70 
71  hr = AddController();
72  if (FAILED(hr))
73  return hr;
74 
76  if (xmlCtrl == NULL)
77  return E_FAIL;
78 
79  hr = AddVariable(xmlCtrl);
80  if (FAILED(hr))
81  return hr;
82 
84  if (xmlRob == NULL)
85  return E_FAIL;
86 
87  hr = AddRobot(xmlRob);
88  if (FAILED(hr))
89  return hr;
90 
92  if (xmlTsk == NULL)
93  return E_FAIL;
94 
95  hr = AddTask(xmlTsk);
96  if (FAILED(hr))
97  return hr;
98 
99  hr = GetVariableVersion();
100 
101  return hr;
102 }
103 
105 {
106  DensoRobot_Vec::iterator itRob;
107  for (itRob = m_vecRobot.begin(); itRob != m_vecRobot.end(); itRob++)
108  {
109  (*itRob)->StartService(node);
110  }
111 
112  DensoTask_Vec::iterator itTsk;
113  for (itTsk = m_vecTask.begin(); itTsk != m_vecTask.end(); itTsk++)
114  {
115  (*itTsk)->StartService(node);
116  }
117 
118  DensoVariable_Vec::iterator itVar;
119  for (itVar = m_vecVar.begin(); itVar != m_vecVar.end(); itVar++)
120  {
121  (*itVar)->StartService(node);
122  }
123 
124  m_serving = true;
125 
126  return S_OK;
127 }
128 
130 {
131  m_mtxSrv.lock();
132  m_serving = false;
133  m_mtxSrv.unlock();
134 
135  DensoRobot_Vec::iterator itRob;
136  for (itRob = m_vecRobot.begin(); itRob != m_vecRobot.end(); itRob++)
137  {
138  (*itRob)->StopService();
139  }
140 
141  DensoTask_Vec::iterator itTsk;
142  for (itTsk = m_vecTask.begin(); itTsk != m_vecTask.end(); itTsk++)
143  {
144  (*itTsk)->StopService();
145  }
146 
147  DensoVariable_Vec::iterator itVar;
148  for (itVar = m_vecVar.begin(); itVar != m_vecVar.end(); itVar++)
149  {
150  (*itVar)->StopService();
151  }
152 
153  return S_OK;
154 }
155 
157 {
158  boost::mutex::scoped_lock lockSrv(m_mtxSrv);
159  if (!m_serving)
160  return false;
161 
162  DensoRobot_Vec::iterator itRob;
163  for (itRob = m_vecRobot.begin(); itRob != m_vecRobot.end(); itRob++)
164  {
165  (*itRob)->Update();
166  }
167 
168  DensoTask_Vec::iterator itTsk;
169  for (itTsk = m_vecTask.begin(); itTsk != m_vecTask.end(); itTsk++)
170  {
171  (*itTsk)->Update();
172  }
173 
174  DensoVariable_Vec::iterator itVar;
175  for (itVar = m_vecVar.begin(); itVar != m_vecVar.end(); itVar++)
176  {
177  (*itVar)->Update();
178  }
179 
180  return true;
181 }
182 
184 {
185  if (robot == NULL)
186  {
187  return E_INVALIDARG;
188  }
189 
190  DensoBase_Vec vecBase;
191  vecBase.insert(vecBase.end(), m_vecRobot.begin(), m_vecRobot.end());
192 
193  DensoBase_Ptr pBase;
194  HRESULT hr = DensoBase::get_Object(vecBase, index, &pBase);
195  if (SUCCEEDED(hr))
196  {
197  *robot = boost::dynamic_pointer_cast<DensoRobot>(pBase);
198  }
199 
200  return hr;
201 }
202 
203 HRESULT DensoController::get_Task(const std::string& name, DensoTask_Ptr* task)
204 {
205  if (task == NULL)
206  {
207  return E_INVALIDARG;
208  }
209 
210  DensoBase_Vec vecBase;
211  vecBase.insert(vecBase.end(), m_vecTask.begin(), m_vecTask.end());
212 
213  DensoBase_Ptr pBase;
214  HRESULT hr = DensoBase::get_Object(vecBase, name, &pBase);
215  if (SUCCEEDED(hr))
216  {
217  *task = boost::dynamic_pointer_cast<DensoTask>(pBase);
218  }
219 
220  return hr;
221 }
222 
224 {
225  if (var == NULL)
226  {
227  return E_INVALIDARG;
228  }
229 
230  DensoBase_Vec vecBase;
231  vecBase.insert(vecBase.end(), m_vecVar.begin(), m_vecVar.end());
232 
233  DensoBase_Ptr pBase;
234  HRESULT hr = DensoBase::get_Object(vecBase, name, &pBase);
235  if (SUCCEEDED(hr))
236  {
237  *var = boost::dynamic_pointer_cast<DensoVariable>(pBase);
238  }
239 
240  return hr;
241 }
242 
244 {
245  int objs;
246  HRESULT hr;
247 
248  Name_Vec vecName;
250  if (SUCCEEDED(hr))
251  {
252  for (objs = 0; objs < vecName.size(); objs++)
253  {
254  Handle_Vec vecHandle;
255  hr = DensoBase::AddObject(ID_CONTROLLER_GETTASK, vecName[objs], vecHandle);
256  if (FAILED(hr))
257  break;
258 
259  DensoTask_Ptr tsk(new DensoTask(this, m_vecService, vecHandle, vecName[objs], m_mode));
260 
261  hr = tsk->InitializeBCAP(xmlElem);
262  if (FAILED(hr))
263  break;
264 
265  m_vecTask.push_back(tsk);
266  }
267  }
268 
269  return hr;
270 }
271 
272 HRESULT DensoController::AddVariable(const std::string& name)
273 {
275 }
276 
278 {
279  HRESULT hr = S_OK;
280  XMLElement* xmlVar;
281 
282  for (xmlVar = xmlElem->FirstChildElement(DensoVariable::XML_VARIABLE_NAME); xmlVar != NULL;
284  {
286  if (FAILED(hr))
287  break;
288  }
289 
290  return hr;
291 }
292 
299 {
300  int argc;
301  VARIANT_Vec vntArgs;
302  VARIANT_Ptr vntRet(new VARIANT());
303 
304  for (argc = 0; argc < BCAP_CONTROLLER_EXECUTE_ARGS; argc++)
305  {
306  VARIANT_Ptr vntTmp(new VARIANT());
307 
308  VariantInit(vntTmp.get());
309 
310  switch (argc)
311  {
312  case 0:
313  vntTmp->vt = VT_I4;
314  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_WATCH];
315  break;
316  case 1:
317  vntTmp->vt = VT_BSTR;
318  vntTmp->bstrVal = SysAllocString(L"ClearError");
319  break;
320  }
321 
322  vntArgs.push_back(*vntTmp.get());
323  }
324 
325  return m_vecService[DensoBase::SRV_WATCH]->ExecFunction(ID_CONTROLLER_EXECUTE, vntArgs, vntRet);
326 }
327 
335 {
336  HRESULT hr;
337 
338  int argc;
339  VARIANT_Vec vntArgs;
340  VARIANT_Ptr vntRet(new VARIANT());
341 
342  for (argc = 0; argc < BCAP_CONTROLLER_EXECUTE_ARGS; argc++)
343  {
344  VARIANT_Ptr vntTmp(new VARIANT());
345 
346  VariantInit(vntTmp.get());
347 
348  switch (argc)
349  {
350  case 0:
351  vntTmp->vt = VT_I4;
352  vntTmp->lVal = m_vecHandle[DensoBase::SRV_WATCH];
353  break;
354  case 1:
355  vntTmp->vt = VT_BSTR;
356  vntTmp->bstrVal = SysAllocString(L"GetCurErrorCount");
357  break;
358  }
359 
360  vntArgs.push_back(*vntTmp.get());
361  }
362 
363  hr = m_vecService[DensoBase::SRV_WATCH]->ExecFunction(ID_CONTROLLER_EXECUTE, vntArgs, vntRet);
364 
365  if (FAILED(hr) || (vntRet->vt != VT_I4))
366  {
367  return hr;
368  }
369  count = vntRet->lVal;
370 
371  return hr;
372 }
373 
382 HRESULT DensoController::ExecGetCurErrorInfo(int error_index, HRESULT& error_code, std::string& error_message)
383 {
384  HRESULT hr;
385 
386  int argc;
387  VARIANT_Vec vntArgs;
388  VARIANT_Ptr vntRet(new VARIANT());
389 
390  VARIANT* elements;
391 
392  for (argc = 0; argc < BCAP_CONTROLLER_EXECUTE_ARGS; argc++)
393  {
394  VARIANT_Ptr vntTmp(new VARIANT());
395 
396  VariantInit(vntTmp.get());
397 
398  switch (argc)
399  {
400  case 0:
401  vntTmp->vt = VT_I4;
402  vntTmp->lVal = m_vecHandle[DensoBase::SRV_WATCH];
403  break;
404  case 1:
405  vntTmp->vt = VT_BSTR;
406  vntTmp->bstrVal = SysAllocString(L"GetCurErrorInfo");
407  break;
408  case 2:
409  vntTmp->vt = VT_I4;
410  vntTmp->lVal = error_index;
411  break;
412  }
413 
414  vntArgs.push_back(*vntTmp.get());
415  }
416 
417  hr = m_vecService[DensoBase::SRV_WATCH]->ExecFunction(ID_CONTROLLER_EXECUTE, vntArgs, vntRet);
418 
419  if (FAILED(hr) || (vntRet->vt != (VT_ARRAY | VT_VARIANT)))
420  {
421  return hr;
422  }
423 
424  SafeArrayAccessData(vntRet->parray, (void**)&elements);
425  if (elements[0].vt == VT_I4)
426  {
427  error_code = elements[0].lVal;
428  }
429  if (elements[1].vt == VT_BSTR)
430  {
431  error_message = ConvertBSTRToString(elements[1].bstrVal);
432  }
433  SafeArrayUnaccessData(vntRet->parray);
434 
435  return hr;
436 }
437 
445 HRESULT DensoController::ExecGetErrorDescription(HRESULT error_code, std::string& error_description)
446 {
447  HRESULT hr;
448 
449  int argc;
450  VARIANT_Vec vntArgs;
451  VARIANT_Ptr vntRet(new VARIANT());
452 
453  VARIANT* elements;
454 
455  for (argc = 0; argc < BCAP_CONTROLLER_EXECUTE_ARGS; argc++)
456  {
457  VARIANT_Ptr vntTmp(new VARIANT());
458 
459  VariantInit(vntTmp.get());
460 
461  switch (argc)
462  {
463  case 0:
464  vntTmp->vt = VT_I4;
465  vntTmp->lVal = m_vecHandle[DensoBase::SRV_WATCH];
466  break;
467  case 1:
468  vntTmp->vt = VT_BSTR;
469  vntTmp->bstrVal = SysAllocString(L"GetErrorDescription");
470  break;
471  case 2:
472  vntTmp->vt = VT_I4;
473  vntTmp->lVal = error_code;
474  break;
475  }
476 
477  vntArgs.push_back(*vntTmp.get());
478  }
479 
480  hr = m_vecService[DensoBase::SRV_WATCH]->ExecFunction(ID_CONTROLLER_EXECUTE, vntArgs, vntRet);
481 
482  if (FAILED(hr) || (vntRet->vt != VT_BSTR))
483  {
484  return hr;
485  }
486  error_description = ConvertBSTRToString(vntRet->bstrVal);
487 
488  return hr;
489 }
490 
497 {
498  HRESULT hr;
499  DensoVariable_Ptr pVar;
500  VARIANT_Ptr vntVal(new VARIANT());
501 
502  hr = AddVariable("@VERSION");
503  if (FAILED(hr))
504  return hr;
505  hr = get_Variable("@VERSION", &pVar);
506  if (FAILED(hr))
507  return hr;
508 
509  hr = pVar->ExecGetValue(vntVal);
510  if (FAILED(hr))
511  return hr;
512 
513  int major;
514  int minor;
515  int revision;
516  std::string version_number = DensoBase::ConvertBSTRToString(vntVal->bstrVal);
517  std::istringstream ss(version_number);
518 
519  ss >> major;
520  ss.get();
521  ss >> minor;
522  ss.get();
523  ss >> revision;
524  m_software_version = std::make_tuple(major, minor, revision);
525 
526  return hr;
527 }
528 
529 } // namespace denso_robot_core
HRESULT SafeArrayUnaccessData(SAFEARRAY *psa)
virtual HRESULT AddRobot(XMLElement *xmlElem)=0
virtual HRESULT InitializeBCAP()
Definition: denso_base.h:104
#define ID_CONTROLLER_EXECUTE
XMLError LoadFile(const char *filename)
Definition: tinyxml2.cpp:1814
HRESULT AddVariable(int32_t get_id, const std::string &name, std::vector< boost::shared_ptr< class DensoVariable > > &vecVar, int16_t vt=VT_EMPTY, bool bRead=false, bool bWrite=false, bool bID=false, int iDuration=BCAP_VAR_DEFAULT_DURATION)
virtual HRESULT StartService(ros::NodeHandle &node)
#define S_OK
std::vector< VARIANT, VariantAllocator< VARIANT > > VARIANT_Vec
std::vector< uint32_t > Handle_Vec
Definition: denso_base.h:67
HRESULT GetObjectNames(int32_t func_id, Name_Vec &vecName)
Definition: denso_base.cpp:199
std::tuple< int, int, int > m_software_version
#define FAILED(hr)
VT_I4
#define E_INVALIDARG
VT_BSTR
DensoController(const std::string &name, const int *mode, const ros::Duration dt)
void VariantInit(VARIANT *pvarg)
HRESULT get_Robot(int index, DensoRobot_Ptr *robot)
#define E_FAIL
const XMLElement * NextSiblingElement(const char *value=0) const
Get the next (right) sibling element of this node, with an optionally supplied name.
Definition: tinyxml2.cpp:824
int32_t HRESULT
BSTR SysAllocString(const wchar_t *sz)
VT_ARRAY
static std::string ConvertBSTRToString(const BSTR bstr)
Definition: denso_base.cpp:31
boost::interprocess::unique_ptr< VARIANT, variant_deleter > VARIANT_Ptr
HRESULT SafeArrayAccessData(SAFEARRAY *psa, void **ppvData)
VT_VARIANT
virtual HRESULT AddTask(XMLElement *xmlElem)
#define SUCCEEDED(hr)
virtual HRESULT ExecGetCurErrorCount(int &count)
HRESULT get_Object(const std::vector< boost::shared_ptr< DensoBase > > &vecBase, int index, boost::shared_ptr< DensoBase > *obj)
#define ID_CONTROLLER_GETTASKNAMES
HRESULT get_Task(const std::string &name, DensoTask_Ptr *task)
const XMLElement * FirstChildElement(const char *value=0) const
Definition: tinyxml2.cpp:796
std::vector< std::string > Name_Vec
Definition: denso_base.h:66
virtual HRESULT AddController()=0
static constexpr const char * XML_VARIABLE_NAME
static constexpr const char * XML_ROBOT_NAME
Definition: denso_robot.h:47
#define ID_CONTROLLER_GETTASK
std::vector< DensoBase_Ptr > DensoBase_Vec
Definition: denso_base.h:166
virtual HRESULT ExecGetErrorDescription(HRESULT error_code, std::string &error_description)
HRESULT get_Variable(const std::string &name, DensoVariable_Ptr *var)
virtual HRESULT ExecGetCurErrorInfo(int error_index, HRESULT &error_code, std::string &error_message)
HRESULT AddObject(int32_t get_id, const std::string &name, Handle_Vec &vecHandle)
Definition: denso_base.cpp:153
static constexpr int BCAP_CONTROLLER_EXECUTE_ARGS
HRESULT AddVariable(const std::string &name)
#define ID_CONTROLLER_GETVARIABLE
static constexpr const char * XML_TASK_NAME
Definition: denso_task.h:36
static constexpr const char * XML_CTRL_NAME


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