denso_robot.cpp
Go to the documentation of this file.
1 
26 
27 namespace denso_robot_core
28 {
29 enum
30 {
32  NUM_JOINT = 8,
33  NUM_TRANS = 10
34 };
35 
36 enum
37 {
38  ACT_RESET = -1,
39  ACT_NONE = 0,
46 };
47 
48 DensoRobot::DensoRobot(DensoBase* parent, Service_Vec& service, Handle_Vec& handle, const std::string& name,
49  const int* mode)
50  : DensoBase(parent, service, handle, name, mode)
51  , m_ArmGroup(0)
52  , m_curAct(ACT_RESET)
53  , m_memTimeout(0)
54  , m_memRetry(0)
55  , m_tsfmt(0)
56  , m_timestamp(0)
57  , m_sendfmt(0)
58  , m_send_miniio(0)
59  , m_send_handio(0)
60  , m_recvfmt(0)
61  , m_recv_miniio(0)
62  , m_recv_handio(0)
63  , m_send_userio_offset(UserIO::MIN_USERIO_OFFSET)
64  , m_send_userio_size(1)
65  , m_recv_userio_offset(UserIO::MIN_USERIO_OFFSET)
66  , m_recv_userio_size(1)
67 {
69 
71 
73 }
74 
76 {
77 }
78 
80 {
81  return AddVariable(xmlElem);
82 }
83 
85 {
86  std::string tmpName = DensoBase::RosName();
87 
88  if (*m_mode == 0)
89  {
90  m_subSpeed = node.subscribe<Float32>(tmpName + NAME_SPEED, MESSAGE_QUEUE, &DensoRobot::Callback_Speed, this);
91 
92  m_subChangeTool = node.subscribe<Int32>(tmpName + NAME_CHANGETOOL, MESSAGE_QUEUE,
93  boost::bind(&DensoRobot::Callback_Change, this, "Tool", _1));
94 
95  m_subChangeWork = node.subscribe<Int32>(tmpName + NAME_CHANGEWORK, MESSAGE_QUEUE,
96  boost::bind(&DensoRobot::Callback_Change, this, "Work", _1));
97 
98  m_actMoveString = boost::make_shared<SimpleActionServer<MoveStringAction> >(
99  node, DensoBase::RosName() + NAME_MOVESTRING, boost::bind(&DensoRobot::Callback_MoveString, this, _1), false);
100 
101  m_actMoveString->registerPreemptCallback(boost::bind(&DensoRobot::Callback_Cancel, this));
102 
103  m_actMoveString->start();
104 
105  m_actMoveValue = boost::make_shared<SimpleActionServer<MoveValueAction> >(
106  node, DensoBase::RosName() + NAME_MOVEVALUE, boost::bind(&DensoRobot::Callback_MoveValue, this, _1), false);
107 
108  m_actMoveValue->registerPreemptCallback(boost::bind(&DensoRobot::Callback_Cancel, this));
109 
110  m_actMoveValue->start();
111 
112  m_actDriveExString = boost::make_shared<SimpleActionServer<DriveStringAction> >(
114  boost::bind(&DensoRobot::Callback_DriveString, this, "DriveEx", _1), false);
115 
116  m_actDriveExString->registerPreemptCallback(boost::bind(&DensoRobot::Callback_Cancel, this));
117 
118  m_actDriveExString->start();
119 
120  m_actDriveExValue = boost::make_shared<SimpleActionServer<DriveValueAction> >(
122  boost::bind(&DensoRobot::Callback_DriveValue, this, "DriveEx", _1), false);
123 
124  m_actDriveExValue->registerPreemptCallback(boost::bind(&DensoRobot::Callback_Cancel, this));
125 
126  m_actDriveExValue->start();
127 
128  m_actDriveAExString = boost::make_shared<SimpleActionServer<DriveStringAction> >(
130  boost::bind(&DensoRobot::Callback_DriveString, this, "DriveAEx", _1), false);
131 
132  m_actDriveAExString->registerPreemptCallback(boost::bind(&DensoRobot::Callback_Cancel, this));
133 
134  m_actDriveAExString->start();
135 
136  m_actDriveAExValue = boost::make_shared<SimpleActionServer<DriveValueAction> >(
138  boost::bind(&DensoRobot::Callback_DriveValue, this, "DriveAEx", _1), false);
139 
140  m_actDriveAExValue->registerPreemptCallback(boost::bind(&DensoRobot::Callback_Cancel, this));
141 
142  m_actDriveAExValue->start();
143 
144  m_subArmGroup = node.subscribe<Int32>(tmpName + NAME_ARMGROUP, MESSAGE_QUEUE, &DensoRobot::Callback_ArmGroup, this);
145  }
146 
147  DensoVariable_Vec::iterator itVar;
148  for (itVar = m_vecVar.begin(); itVar != m_vecVar.end(); itVar++)
149  {
150  (*itVar)->StartService(node);
151  }
152 
153  m_serving = true;
154 
155  m_curAct = ACT_NONE;
156 
157  return S_OK;
158 }
159 
161 {
162  m_mtxSrv.lock();
163  m_serving = false;
164  m_mtxSrv.unlock();
165 
167 
168  DensoVariable_Vec::iterator itVar;
169  for (itVar = m_vecVar.begin(); itVar != m_vecVar.end(); itVar++)
170  {
171  (*itVar)->StopService();
172  }
173 
174  m_mtxAct.lock();
176  m_mtxAct.unlock();
177 
181  m_actMoveString.reset();
182  m_actMoveValue.reset();
183  m_actDriveExString.reset();
184  m_actDriveExValue.reset();
185  m_actDriveAExString.reset();
186  m_actDriveAExValue.reset();
187 
188  return S_OK;
189 }
190 
192 {
193  boost::mutex::scoped_lock lockSrv(m_mtxSrv);
194  if (!m_serving)
195  return false;
196 
197  DensoVariable_Vec::iterator itVar;
198  for (itVar = m_vecVar.begin(); itVar != m_vecVar.end(); itVar++)
199  {
200  (*itVar)->Update();
201  }
202 
203  Action_Feedback();
204 
205  return true;
206 }
207 
209 {
210  int argc;
211  VARIANT_Vec vntArgs;
212  VARIANT_Ptr vntRet(new VARIANT());
213  int32_t* pval;
214 
215  VariantInit(vntRet.get());
216 
217  for (argc = 0; argc < BCAP_ROBOT_EXECUTE_ARGS; argc++)
218  {
219  VARIANT_Ptr vntTmp(new VARIANT());
220  VariantInit(vntTmp.get());
221 
222  switch (argc)
223  {
224  case 0:
225  vntTmp->vt = VT_UI4;
226  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_ACT];
227  break;
228  case 1:
229  vntTmp->vt = VT_BSTR;
230  vntTmp->bstrVal = SysAllocString(L"TakeArm");
231  break;
232  case 2:
233  vntTmp->vt = (VT_ARRAY | VT_I4);
234  vntTmp->parray = SafeArrayCreateVector(VT_I4, 0, 2);
235  SafeArrayAccessData(vntTmp->parray, (void**)&pval);
236  pval[0] = m_ArmGroup; // Arm group
237  pval[1] = 1L; // Keep
238  SafeArrayUnaccessData(vntTmp->parray);
239  break;
240  }
241 
242  vntArgs.push_back(*vntTmp.get());
243  }
244 
245  return m_vecService[DensoBase::SRV_ACT]->ExecFunction(ID_ROBOT_EXECUTE, vntArgs, vntRet);
246 }
247 
249 {
250  int argc;
251  VARIANT_Vec vntArgs;
252  VARIANT_Ptr vntRet(new VARIANT());
253 
254  VariantInit(vntRet.get());
255 
256  for (argc = 0; argc < BCAP_ROBOT_EXECUTE_ARGS; argc++)
257  {
258  VARIANT_Ptr vntTmp(new VARIANT());
259  VariantInit(vntTmp.get());
260 
261  switch (argc)
262  {
263  case 0:
264  vntTmp->vt = VT_UI4;
265  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_ACT];
266  break;
267  case 1:
268  vntTmp->vt = VT_BSTR;
269  vntTmp->bstrVal = SysAllocString(L"GiveArm");
270  break;
271  }
272 
273  vntArgs.push_back(*vntTmp.get());
274  }
275 
276  return m_vecService[DensoBase::SRV_ACT]->ExecFunction(ID_ROBOT_EXECUTE, vntArgs, vntRet);
277 }
278 
280 {
281  m_ArmGroup = number;
282 }
283 
284 void DensoRobot::Callback_ArmGroup(const Int32::ConstPtr& msg)
285 {
286  ChangeArmGroup(msg->data);
287 }
288 
289 HRESULT DensoRobot::get_Variable(const std::string& name, DensoVariable_Ptr* var)
290 {
291  if (var == NULL)
292  {
293  return E_INVALIDARG;
294  }
295 
296  DensoBase_Vec vecBase;
297  vecBase.insert(vecBase.end(), m_vecVar.begin(), m_vecVar.end());
298 
299  DensoBase_Ptr pBase;
300  HRESULT hr = DensoBase::get_Object(vecBase, name, &pBase);
301  if (SUCCEEDED(hr))
302  {
303  *var = boost::dynamic_pointer_cast<DensoVariable>(pBase);
304  }
305 
306  return hr;
307 }
308 
309 HRESULT DensoRobot::AddVariable(const std::string& name)
310 {
312 }
313 
315 {
316  HRESULT hr = S_OK;
317  XMLElement* xmlVar;
318 
319  for (xmlVar = xmlElem->FirstChildElement(DensoVariable::XML_VARIABLE_NAME); xmlVar != NULL;
321  {
323  if (FAILED(hr))
324  break;
325  }
326 
327  return hr;
328 }
329 
330 HRESULT DensoRobot::ExecMove(int comp, const VARIANT_Ptr& pose, const std::string& option)
331 {
332  HRESULT hr;
333 
334  hr = ExecTakeArm();
335  if (SUCCEEDED(hr))
336  {
337  int argc;
338  VARIANT_Vec vntArgs;
339  VARIANT_Ptr vntRet(new VARIANT());
340 
341  VariantInit(vntRet.get());
342 
343  for (argc = 0; argc < BCAP_ROBOT_MOVE_ARGS; argc++)
344  {
345  VARIANT_Ptr vntTmp(new VARIANT());
346  VariantInit(vntTmp.get());
347 
348  switch (argc)
349  {
350  case 0:
351  vntTmp->vt = VT_UI4;
352  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_ACT];
353  break;
354  case 1:
355  vntTmp->vt = VT_I4;
356  vntTmp->lVal = comp;
357  break;
358  case 2:
359  VariantCopy(vntTmp.get(), pose.get());
360  break;
361  case 3:
362  vntTmp->vt = VT_BSTR;
363  vntTmp->bstrVal = ConvertStringToBSTR(option);
364  break;
365  }
366 
367  vntArgs.push_back(*vntTmp.get());
368  }
369 
370  hr = m_vecService[DensoBase::SRV_ACT]->ExecFunction(ID_ROBOT_MOVE, vntArgs, vntRet);
371 
372  ExecGiveArm();
373  }
374 
375  return hr;
376 }
377 
378 HRESULT DensoRobot::ExecDrive(const std::string& name, const VARIANT_Ptr& option)
379 {
380  HRESULT hr;
381 
382  hr = ExecTakeArm();
383  if (SUCCEEDED(hr))
384  {
385  int argc;
386  VARIANT_Vec vntArgs;
387  VARIANT_Ptr vntRet(new VARIANT());
388 
389  VariantInit(vntRet.get());
390 
391  for (int argc = 0; argc < BCAP_ROBOT_EXECUTE_ARGS; argc++)
392  {
393  VARIANT_Ptr vntTmp(new VARIANT());
394  VariantInit(vntTmp.get());
395 
396  switch (argc)
397  {
398  case 0:
399  vntTmp->vt = VT_UI4;
400  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_ACT];
401  break;
402  case 1:
403  vntTmp->vt = VT_BSTR;
404  vntTmp->bstrVal = ConvertStringToBSTR(name);
405  break;
406  case 2:
407  VariantCopy(vntTmp.get(), option.get());
408  break;
409  }
410 
411  vntArgs.push_back(*vntTmp.get());
412  }
413 
414  hr = m_vecService[DensoBase::SRV_ACT]->ExecFunction(ID_ROBOT_EXECUTE, vntArgs, vntRet);
415 
416  ExecGiveArm();
417  }
418 
419  return hr;
420 }
421 
423 {
424  HRESULT hr;
425 
426  hr = ExecTakeArm();
427  if (SUCCEEDED(hr))
428  {
429  int argc;
430  VARIANT_Vec vntArgs;
431  VARIANT_Ptr vntRet(new VARIANT());
432 
433  VariantInit(vntRet.get());
434 
435  for (argc = 0; argc < BCAP_ROBOT_SPEED_ARGS; argc++)
436  {
437  VARIANT_Ptr vntTmp(new VARIANT());
438  VariantInit(vntTmp.get());
439 
440  switch (argc)
441  {
442  case 0:
443  vntTmp->vt = VT_UI4;
444  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_ACT];
445  break;
446  case 1:
447  vntTmp->vt = VT_I4;
448  vntTmp->lVal = -1;
449  break;
450  case 2:
451  vntTmp->vt = VT_R4;
452  vntTmp->fltVal = value;
453  break;
454  }
455 
456  vntArgs.push_back(*vntTmp.get());
457  }
458 
459  hr = m_vecService[DensoBase::SRV_ACT]->ExecFunction(ID_ROBOT_SPEED, vntArgs, vntRet);
460 
461  ExecGiveArm();
462  }
463 
464  return hr;
465 }
466 
467 HRESULT DensoRobot::ExecChange(const std::string& value)
468 {
469  HRESULT hr;
470 
471  hr = ExecTakeArm();
472  if (SUCCEEDED(hr))
473  {
474  int argc;
475  VARIANT_Vec vntArgs;
476  VARIANT_Ptr vntRet(new VARIANT());
477 
478  VariantInit(vntRet.get());
479 
480  for (argc = 0; argc < BCAP_ROBOT_CHANGE_ARGS; argc++)
481  {
482  VARIANT_Ptr vntTmp(new VARIANT());
483  VariantInit(vntTmp.get());
484 
485  switch (argc)
486  {
487  case 0:
488  vntTmp->vt = VT_UI4;
489  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_ACT];
490  break;
491  case 1:
492  vntTmp->vt = VT_BSTR;
493  vntTmp->bstrVal = ConvertStringToBSTR(value);
494  break;
495  }
496 
497  vntArgs.push_back(*vntTmp.get());
498  }
499 
500  hr = m_vecService[DensoBase::SRV_ACT]->ExecFunction(ID_ROBOT_CHANGE, vntArgs, vntRet);
501 
502  ExecGiveArm();
503  }
504 
505  return hr;
506 }
507 
509 {
510  int argc;
511  VARIANT_Vec vntArgs;
512  VARIANT_Ptr vntRet(new VARIANT());
513 
514  for (argc = 0; argc < BCAP_ROBOT_HALT_ARGS; argc++)
515  {
516  VARIANT_Ptr vntTmp(new VARIANT());
517 
518  VariantInit(vntTmp.get());
519 
520  switch (argc)
521  {
522  case 0:
523  vntTmp->vt = VT_UI4;
524  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_WATCH];
525  break;
526  case 1:
527  vntTmp->vt = VT_BSTR;
528  vntTmp->bstrVal = SysAllocString(L"");
529  break;
530  }
531 
532  vntArgs.push_back(*vntTmp.get());
533  }
534 
535  return m_vecService[DensoBase::SRV_WATCH]->ExecFunction(ID_ROBOT_HALT, vntArgs, vntRet);
536 }
537 
538 HRESULT DensoRobot::ExecCurJnt(std::vector<double>& pose)
539 {
540  HRESULT hr;
541 
542  int argc;
543  VARIANT_Vec vntArgs;
544  VARIANT_Ptr vntRet(new VARIANT());
545 
546  VariantInit(vntRet.get());
547 
548  for (argc = 0; argc < BCAP_ROBOT_EXECUTE_ARGS; argc++)
549  {
550  VARIANT_Ptr vntTmp(new VARIANT());
551  VariantInit(vntTmp.get());
552 
553  switch (argc)
554  {
555  case 0:
556  vntTmp->vt = VT_UI4;
557  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_WATCH];
558  break;
559  case 1:
560  vntTmp->vt = VT_BSTR;
561  vntTmp->bstrVal = SysAllocString(L"HighCurJntEx");
562  break;
563  }
564 
565  vntArgs.push_back(*vntTmp.get());
566  }
567 
568  hr = m_vecService[DensoBase::SRV_WATCH]->ExecFunction(ID_ROBOT_EXECUTE, vntArgs, vntRet);
569 
570  if (SUCCEEDED(hr) && (vntRet->vt == (VT_ARRAY | VT_R8)))
571  {
572  uint32_t num;
573  double* pdblval;
574 
575  num = vntRet->parray->rgsabound->cElements;
576  SafeArrayAccessData(vntRet->parray, (void**)&pdblval);
577  pose.resize(num - 1);
578  std::copy(&pdblval[1], &pdblval[num], pose.begin());
579  SafeArrayUnaccessData(vntRet->parray);
580  }
581 
582  return hr;
583 }
584 
585 HRESULT DensoRobot::ExecSlaveMove(const std::vector<double>& pose, std::vector<double>& joint)
586 {
587  HRESULT hr = S_OK;
588  int argc;
589  VARIANT_Vec vntArgs;
590  VARIANT_Ptr vntRet(new VARIANT());
591 
592  VariantInit(vntRet.get());
593 
594  for (argc = 0; argc < BCAP_ROBOT_EXECUTE_ARGS; argc++)
595  {
596  VARIANT_Ptr vntTmp(new VARIANT());
597  VariantInit(vntTmp.get());
598 
599  switch (argc)
600  {
601  case 0:
602  vntTmp->vt = VT_UI4;
603  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_ACT];
604  break;
605  case 1:
606  vntTmp->vt = VT_BSTR;
607  vntTmp->bstrVal = SysAllocString(L"slvMove");
608  break;
609  case 2:
612  if (FAILED(hr))
613  return hr;
614  break;
615  }
616 
617  vntArgs.push_back(*vntTmp.get());
618  }
619 
620  hr = m_vecService[DensoBase::SRV_ACT]->ExecFunction(ID_ROBOT_EXECUTE, vntArgs, vntRet);
621  if (SUCCEEDED(hr))
622  {
625 
626  joint = m_joint;
627 
628  if (FAILED(hrTmp))
629  {
630  hr = hrTmp;
631  }
632  }
633 
634  return hr;
635 }
636 
638 {
639  return m_sendfmt;
640 }
641 
646 {
647  ROS_WARN("DensoRobot::put_SendFormat() has been deprecated.");
648  switch (format)
649  {
650  case SENDFMT_NONE:
651  case SENDFMT_HANDIO:
652  case SENDFMT_MINIIO:
654  case SENDFMT_USERIO:
656  m_sendfmt = format;
657  break;
658  default:
659  ROS_WARN("Failed to put_SendFormat.");
660  break;
661  }
662 }
663 
665 {
666  m_sendfmt = format;
667 }
668 
670 {
671  return m_recvfmt;
672 }
673 
678 {
679  ROS_WARN("DensoRobot::put_RecvFormat() has been deprecated.");
680  int pose = format & RECVFMT_POSE;
681  if ((RECVFMT_NONE <= pose) && (pose <= RECVFMT_POSE_TJ))
682  {
683  switch (format & ~RECVFMT_POSE)
684  {
685  case RECVFMT_NONE:
686  case RECVFMT_TIME:
687  case RECVFMT_HANDIO:
688  case RECVFMT_CURRENT:
689  case RECVFMT_MINIIO:
690  case RECVFMT_USERIO:
708  m_recvfmt = format;
709  break;
710  default:
711  ROS_WARN("Failed to put_RecvFormat.");
712  break;
713  }
714  }
715  else
716  {
717  ROS_WARN("Failed to put_RecvFormat.");
718  }
719 }
720 
722 {
723  m_recvfmt = format;
724 }
725 
727 {
728  return m_tsfmt;
729 }
730 
732 {
733  if ((format == TSFMT_MILLISEC) || (format == TSFMT_MICROSEC))
734  {
735  m_tsfmt = format;
736  }
737  else
738  {
739  ROS_WARN("Failed to put_TimeFormat.");
740  }
741 }
742 
743 unsigned int DensoRobot::get_MiniIO() const
744 {
745  return m_recv_miniio;
746 }
747 
748 void DensoRobot::put_MiniIO(unsigned int value)
749 {
750  m_send_miniio = value;
751 }
752 
753 unsigned int DensoRobot::get_HandIO() const
754 {
755  return m_recv_handio;
756 }
757 
758 void DensoRobot::put_HandIO(unsigned int value)
759 {
760  m_send_handio = value;
761 }
762 
763 void DensoRobot::put_SendUserIO(const UserIO& value)
764 {
765  if (value.offset < UserIO::MIN_USERIO_OFFSET)
766  {
767  ROS_WARN("User I/O offset has to be greater than %d.", UserIO::MIN_USERIO_OFFSET - 1);
768  return;
769  }
770 
771  if (value.offset % UserIO::USERIO_ALIGNMENT)
772  {
773  ROS_WARN("User I/O offset has to be multiple of %d.", UserIO::USERIO_ALIGNMENT);
774  return;
775  }
776 
777  if (value.size <= 0)
778  {
779  ROS_WARN("User I/O size has to be greater than 0.");
780  return;
781  }
782 
783  if (value.size < value.value.size())
784  {
785  ROS_WARN("User I/O size has to be equal or greater than the value length.");
786  return;
787  }
788 
789  m_send_userio_offset = value.offset;
790  m_send_userio_size = value.size;
791  m_send_userio = value.value;
792 }
793 
794 void DensoRobot::put_RecvUserIO(const UserIO& value)
795 {
796  if (value.offset < UserIO::MIN_USERIO_OFFSET)
797  {
798  ROS_WARN("User I/O offset has to be greater than %d.", UserIO::MIN_USERIO_OFFSET - 1);
799  return;
800  }
801 
802  if (value.offset % UserIO::USERIO_ALIGNMENT)
803  {
804  ROS_WARN("User I/O offset has to be multiple of %d.", UserIO::USERIO_ALIGNMENT);
805  return;
806  }
807 
808  if (value.size <= 0)
809  {
810  ROS_WARN("User I/O size has to be greater than 0.");
811  return;
812  }
813 
814  m_recv_userio_offset = value.offset;
815  m_recv_userio_size = value.size;
816 }
817 
818 void DensoRobot::get_RecvUserIO(UserIO& value) const
819 {
820  value.offset = m_recv_userio_offset;
821  value.size = m_recv_userio.size();
822  value.value = m_recv_userio;
823 }
824 
825 void DensoRobot::get_Current(std::vector<double>& current) const
826 {
827  current = m_current;
828 }
829 
831 {
832  return m_timestamp;
833 }
834 
835 HRESULT DensoRobot::CreatePoseData(const PoseData& pose, VARIANT& vnt)
836 {
837  uint32_t i, j;
838  uint32_t num = 3 + (((pose.exjoints.mode != 0) && (pose.exjoints.joints.size() > 0)) ? 1 : 0);
839  float* pfltval;
840  VARIANT* pvntval;
841 
842  vnt.vt = (VT_ARRAY | VT_VARIANT);
843  vnt.parray = SafeArrayCreateVector(VT_VARIANT, 0, num);
844 
845  SafeArrayAccessData(vnt.parray, (void**)&pvntval);
846 
847  for (i = 0; i < num; i++)
848  {
849  switch (i)
850  {
851  case 0:
852  pvntval[i].vt = (VT_ARRAY | VT_R4);
853  pvntval[i].parray = SafeArrayCreateVector(VT_R4, 0, pose.value.size());
854  SafeArrayAccessData(pvntval[i].parray, (void**)&pfltval);
855  std::copy(pose.value.begin(), pose.value.end(), pfltval);
856  SafeArrayUnaccessData(pvntval[i].parray);
857  break;
858  case 1:
859  pvntval[i].vt = VT_I4;
860  pvntval[i].lVal = pose.type;
861  break;
862  case 2:
863  pvntval[i].vt = VT_I4;
864  pvntval[i].lVal = pose.pass;
865  break;
866  case 3:
867  CreateExJoints(pose.exjoints, pvntval[i]);
868  break;
869  }
870  }
871 
873 
874  return S_OK;
875 }
876 
877 HRESULT DensoRobot::CreateExJoints(const ExJoints& exjoints, VARIANT& vnt)
878 {
879  uint32_t i, j;
880  uint32_t num = 1 + exjoints.joints.size();
881  VARIANT *pvntval, *pjntval;
882 
883  vnt.vt = (VT_ARRAY | VT_VARIANT);
884  vnt.parray = SafeArrayCreateVector(VT_VARIANT, 0, num);
885 
886  SafeArrayAccessData(vnt.parray, (void**)&pvntval);
887 
888  for (i = 0; i < num; i++)
889  {
890  if (i == 0)
891  {
892  pvntval[0].vt = VT_I4;
893  pvntval[0].lVal = exjoints.mode;
894  }
895  else
896  {
897  pvntval[i].vt = (VT_ARRAY | VT_VARIANT);
898  pvntval[i].parray = SafeArrayCreateVector(VT_VARIANT, 0, 2);
899  SafeArrayAccessData(pvntval[i].parray, (void**)&pjntval);
900  pjntval[0].vt = VT_I4;
901  pjntval[0].lVal = exjoints.joints.at(i - 1).joint;
902  pjntval[1].vt = VT_R4;
903  pjntval[1].fltVal = exjoints.joints.at(i - 1).value;
904  SafeArrayUnaccessData(pvntval[i].parray);
905  }
906  }
907 
909 
910  return S_OK;
911 }
912 
914 {
915  HRESULT hr = S_OK;
916 
917  if (*m_mode == 0)
918  {
919  // Change to slave mode
920  if (mode != 0)
921  {
922  hr = ExecSlaveMode("slvSendFormat", m_sendfmt);
923  if (FAILED(hr))
924  {
925  ROS_ERROR("Invalid argument value (send_format = 0x%x)", m_sendfmt);
926  return hr;
927  }
928  hr = ExecSlaveMode("slvRecvFormat", m_recvfmt, m_tsfmt);
929  if (FAILED(hr))
930  {
931  ROS_ERROR("Invalid argument value (recv_format = 0x%x)", m_recvfmt);
932  return hr;
933  }
934  hr = ExecTakeArm();
935  if (FAILED(hr))
936  return hr;
937 
938  hr = ExecSlaveMode("slvChangeMode", mode);
939  if (FAILED(hr))
940  return hr;
941 
942  m_memTimeout = m_vecService[DensoBase::SRV_ACT]->get_Timeout();
945  {
947  }
948  else
949  {
951  }
952  ROS_INFO("bcap-slave timeout changed to %d msec [mode: 0x%X]", m_vecService[DensoBase::SRV_ACT]->get_Timeout(),
953  mode);
954  m_vecService[DensoBase::SRV_ACT]->put_Retry(3);
955  }
956  }
957  else
958  {
961 
962  hr = ExecSlaveMode("slvChangeMode", mode);
963  ExecGiveArm();
964  }
965 
966  return hr;
967 }
968 
969 HRESULT DensoRobot::ExecSlaveMode(const std::string& name, int32_t format, int32_t option)
970 {
971  int argc;
972  VARIANT_Vec vntArgs;
973  VARIANT_Ptr vntRet(new VARIANT());
974  int32_t* pval;
975 
976  VariantInit(vntRet.get());
977 
978  for (argc = 0; argc < BCAP_ROBOT_EXECUTE_ARGS; argc++)
979  {
980  VARIANT_Ptr vntTmp(new VARIANT());
981  VariantInit(vntTmp.get());
982 
983  switch (argc)
984  {
985  case 0:
986  vntTmp->vt = VT_UI4;
987  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_ACT];
988  break;
989  case 1:
990  vntTmp->vt = VT_BSTR;
991  vntTmp->bstrVal = ConvertStringToBSTR(name);
992  break;
993  case 2:
994  if (option == 0)
995  {
996  vntTmp->vt = VT_I4;
997  vntTmp->lVal = format;
998  }
999  else
1000  {
1001  vntTmp->vt = (VT_ARRAY | VT_I4);
1002  vntTmp->parray = SafeArrayCreateVector(VT_I4, 0, 2);
1003  SafeArrayAccessData(vntTmp->parray, (void**)&pval);
1004  pval[0] = format;
1005  pval[1] = option;
1006  SafeArrayUnaccessData(vntTmp->parray);
1007  }
1008  break;
1009  }
1010 
1011  vntArgs.push_back(*vntTmp.get());
1012  }
1013 
1014  return m_vecService[DensoBase::SRV_ACT]->ExecFunction(ID_ROBOT_EXECUTE, vntArgs, vntRet);
1015 }
1016 
1017 HRESULT DensoRobot::CreateSendParameter(const std::vector<double>& pose, VARIANT_Ptr& send, const int miniio,
1018  const int handio, const int recv_userio_offset, const int recv_userio_size,
1019  const int send_userio_offset, const int send_userio_size,
1020  const std::vector<uint8_t>& send_userio)
1021 {
1022  int type = *m_mode & SLVMODE_POSE;
1023 
1024  // Check pose type
1025  int joints = 0;
1026  switch (type)
1027  {
1028  case SLVMODE_POSE_P:
1029  joints = NUM_POSITION;
1030  break;
1031  case SLVMODE_POSE_J:
1032  joints = NUM_JOINT;
1033  break;
1034  case SLVMODE_POSE_T:
1035  joints = NUM_TRANS;
1036  break;
1037  default:
1038  return E_FAIL;
1039  }
1040 
1041  // if(joints < pose.size()) {
1042  // return E_FAIL;
1043  //}
1044 
1045  // Check send format
1046  bool send_hio, send_mio, send_uio, recv_uio;
1047  send_hio = m_sendfmt & SENDFMT_HANDIO;
1048  send_mio = m_sendfmt & SENDFMT_MINIIO;
1049  send_uio = m_sendfmt & SENDFMT_USERIO;
1050 
1051  if (send_uio)
1052  {
1053  if (send_userio_size < send_userio.size())
1054  {
1055  return E_FAIL;
1056  }
1057  }
1058 
1059  // Check receive format
1060  recv_uio = m_recvfmt & RECVFMT_USERIO;
1061 
1062  // Number of arguments
1063  int num = 1 + send_hio + send_mio + 3 * send_uio + 2 * recv_uio;
1064 
1065  VARIANT* pvnt;
1066  double* pdbl;
1067  uint8_t* pbool;
1068 
1069  // Number of joints + option
1070  joints += 1;
1071  if (num == 1)
1072  {
1073  // Pose only
1074  send->vt = (VT_ARRAY | VT_R8);
1075  send->parray = SafeArrayCreateVector(VT_R8, 0, joints);
1076  SafeArrayAccessData(send->parray, (void**)&pdbl);
1077  memset(pdbl, 0, joints * sizeof(double));
1078  std::copy(pose.begin(), pose.end(), pdbl);
1079  SafeArrayUnaccessData(send->parray);
1080  }
1081  else
1082  {
1083  send->vt = (VT_ARRAY | VT_VARIANT);
1084  send->parray = SafeArrayCreateVector(VT_VARIANT, 0, num);
1085 
1086  SafeArrayAccessData(send->parray, (void**)&pvnt);
1087 
1088  int offset = 0;
1089 
1090  // Pose
1091  {
1092  pvnt[offset].vt = (VT_ARRAY | VT_R8);
1093  pvnt[offset].parray = SafeArrayCreateVector(VT_R8, 0, joints);
1094  SafeArrayAccessData(pvnt[offset].parray, (void**)&pdbl);
1095  memset(pdbl, 0, joints * sizeof(double));
1096  std::copy(pose.begin(), pose.end(), pdbl);
1097  SafeArrayUnaccessData(pvnt[offset].parray);
1098 
1099  offset++;
1100  }
1101 
1102  // Mini I/O
1103  if (send_mio)
1104  {
1105  pvnt[offset].vt = VT_I4;
1106  pvnt[offset].lVal = miniio;
1107 
1108  offset++;
1109  }
1110 
1111  // Send User I/O
1112  if (send_uio)
1113  {
1114  pvnt[offset + 0].vt = VT_I4;
1115  pvnt[offset + 0].lVal = send_userio_offset;
1116 
1117  pvnt[offset + 1].vt = VT_I4;
1118  pvnt[offset + 1].lVal = send_userio_size * UserIO::USERIO_ALIGNMENT;
1119 
1120  pvnt[offset + 2].vt = (VT_ARRAY | VT_UI1);
1121  pvnt[offset + 2].parray = SafeArrayCreateVector(VT_UI1, 0, send_userio_size);
1122  SafeArrayAccessData(pvnt[offset + 2].parray, (void**)&pbool);
1123  memset(pbool, 0, send_userio_size * sizeof(uint8_t));
1124  std::copy(send_userio.begin(), send_userio.end(), pbool);
1125  SafeArrayUnaccessData(pvnt[offset + 2].parray);
1126 
1127  offset += 3;
1128  }
1129 
1130  // Receive User I/O
1131  if (recv_uio)
1132  {
1133  pvnt[offset + 0].vt = VT_I4;
1134  pvnt[offset + 0].lVal = recv_userio_offset;
1135 
1136  pvnt[offset + 1].vt = VT_I4;
1137  pvnt[offset + 1].lVal = recv_userio_size * UserIO::USERIO_ALIGNMENT;
1138 
1139  offset += 2;
1140  }
1141 
1142  // Hand I/O
1143  if (send_hio)
1144  {
1145  pvnt[offset].vt = VT_I4;
1146  pvnt[offset].lVal = handio;
1147 
1148  offset++;
1149  }
1150 
1151  SafeArrayUnaccessData(send->parray);
1152  }
1153 
1154  return S_OK;
1155 }
1156 
1157 HRESULT DensoRobot::ParseRecvParameter(const VARIANT_Ptr& recv, std::vector<double>& position,
1158  std::vector<double>& joint, std::vector<double>& trans, int& miniio, int& handio,
1159  int& timestamp, std::vector<uint8_t>& recv_userio, std::vector<double>& current)
1160 {
1161  int type = m_recvfmt & SLVMODE_POSE;
1162 
1163  // Check pose type
1164  int j = 0, j1 = 0, j2 = 0, joints = 0;
1165  std::vector<double>*pose1 = NULL, *pose2 = NULL;
1166 
1167  switch (type)
1168  {
1169  case RECVFMT_POSE_P:
1170  j1 = NUM_POSITION;
1171  pose1 = &position;
1172  break;
1173  case RECVFMT_POSE_J:
1174  j1 = NUM_JOINT;
1175  pose1 = &joint;
1176  break;
1177  case RECVFMT_POSE_T:
1178  j1 = NUM_TRANS;
1179  pose1 = &trans;
1180  break;
1181  case RECVFMT_POSE_PJ:
1182  j1 = NUM_POSITION;
1183  j2 = NUM_JOINT;
1184  pose1 = &position;
1185  pose2 = &joint;
1186  break;
1187  case RECVFMT_POSE_TJ:
1188  j1 = NUM_TRANS;
1189  j2 = NUM_JOINT;
1190  pose1 = &trans;
1191  pose2 = &joint;
1192  break;
1193  default:
1194  return E_FAIL;
1195  }
1196 
1197  joints = j1 + j2;
1198 
1199  // Check receive format
1200  bool recv_ts, recv_hio, recv_mio, recv_uio, recv_crt;
1201  recv_ts = m_recvfmt & RECVFMT_TIME;
1202  recv_hio = m_recvfmt & RECVFMT_HANDIO;
1203  recv_mio = m_recvfmt & RECVFMT_MINIIO;
1204  recv_uio = m_recvfmt & RECVFMT_USERIO;
1205  recv_crt = m_recvfmt & RECVFMT_CURRENT;
1206 
1207  // Number of arguments
1208  int num = 1 + recv_ts + recv_hio + recv_mio + recv_uio + recv_crt;
1209 
1210  HRESULT hr = S_OK;
1211  VARIANT* pvnt;
1212  double* pdbl;
1213  uint8_t* pbool;
1214 
1215  if (recv->vt == (VT_ARRAY | VT_R8))
1216  {
1217  if (joints != recv->parray->rgsabound->cElements)
1218  {
1219  return E_FAIL;
1220  }
1221 
1222  // Pose only
1223  SafeArrayAccessData(recv->parray, (void**)&pdbl);
1224  pose1->resize(j1);
1225  std::copy(pdbl, &pdbl[j1], pose1->begin());
1226  if (pose2 != NULL)
1227  {
1228  pose2->resize(j2);
1229  std::copy(&pdbl[j1], &pdbl[joints], pose2->begin());
1230  }
1231  SafeArrayUnaccessData(recv->parray);
1232  }
1233  else if (recv->vt == (VT_ARRAY | VT_VARIANT))
1234  {
1235  if (num != recv->parray->rgsabound->cElements)
1236  {
1237  return E_FAIL;
1238  }
1239 
1240  SafeArrayAccessData(recv->parray, (void**)&pvnt);
1241 
1242  int offset = 0;
1243 
1244  // Timestamp
1245  if (recv_ts)
1246  {
1247  if (pvnt[offset].vt != VT_I4)
1248  {
1249  hr = E_FAIL;
1250  goto exit_proc;
1251  }
1252 
1253  timestamp = pvnt[offset].lVal;
1254 
1255  offset++;
1256  }
1257 
1258  // Pose
1259  {
1260  if ((pvnt[offset].vt != (VT_ARRAY | VT_R8)) || (joints != pvnt[offset].parray->rgsabound->cElements))
1261  {
1262  hr = E_FAIL;
1263  goto exit_proc;
1264  }
1265 
1266  SafeArrayAccessData(pvnt[offset].parray, (void**)&pdbl);
1267  pose1->resize(j1);
1268  std::copy(pdbl, &pdbl[j1], pose1->begin());
1269  if (pose2 != NULL)
1270  {
1271  pose2->resize(j2);
1272  std::copy(&pdbl[j1], &pdbl[joints], pose2->begin());
1273  }
1274  SafeArrayUnaccessData(pvnt[offset].parray);
1275 
1276  offset++;
1277  }
1278 
1279  // Mini I/O
1280  if (recv_mio)
1281  {
1282  if (pvnt[offset].vt != VT_I4)
1283  {
1284  hr = E_FAIL;
1285  goto exit_proc;
1286  }
1287 
1288  miniio = pvnt[offset].lVal;
1289 
1290  offset++;
1291  }
1292 
1293  // User I/O
1294  if (recv_uio)
1295  {
1296  if (pvnt[offset].vt != (VT_ARRAY | VT_UI1))
1297  {
1298  hr = E_FAIL;
1299  goto exit_proc;
1300  }
1301 
1302  SafeArrayAccessData(pvnt[offset].parray, (void**)&pbool);
1303  recv_userio.resize(pvnt[offset].parray->rgsabound->cElements);
1304  std::copy(pbool, &pbool[pvnt[offset].parray->rgsabound->cElements], recv_userio.begin());
1305  SafeArrayUnaccessData(pvnt[offset].parray);
1306 
1307  offset++;
1308  }
1309 
1310  // Hand I/O
1311  if (recv_hio)
1312  {
1313  if (pvnt[offset].vt != VT_I4)
1314  {
1315  hr = E_FAIL;
1316  goto exit_proc;
1317  }
1318 
1319  handio = pvnt[offset].lVal;
1320 
1321  offset++;
1322  }
1323 
1324  // Current
1325  if (recv_crt)
1326  {
1327  if ((pvnt[offset].vt != (VT_ARRAY | VT_R8)) || (8 != pvnt[offset].parray->rgsabound->cElements))
1328  {
1329  hr = E_FAIL;
1330  goto exit_proc;
1331  }
1332 
1333  SafeArrayAccessData(pvnt[offset].parray, (void**)&pdbl);
1334  current.resize(8);
1335  std::copy(pdbl, &pdbl[8], current.begin());
1336  SafeArrayUnaccessData(pvnt[offset].parray);
1337 
1338  offset++;
1339  }
1340 
1341  exit_proc:
1342  SafeArrayUnaccessData(recv->parray);
1343  }
1344  else
1345  {
1346  return E_FAIL;
1347  }
1348 
1349  return hr;
1350 }
1351 
1352 void DensoRobot::Callback_MoveString(const MoveStringGoalConstPtr& goal)
1353 {
1354  HRESULT hr;
1355  MoveStringResult res;
1356 
1357  // Set current action
1358  boost::mutex::scoped_lock lockAct(m_mtxAct);
1359  if (m_curAct != ACT_NONE)
1360  {
1361  if (m_curAct != ACT_RESET)
1362  {
1363  res.HRESULT = E_FAIL;
1364  m_actMoveString->setAborted(res);
1365  }
1366  return;
1367  }
1369  lockAct.unlock();
1370 
1371  VARIANT_Ptr vntPose(new VARIANT());
1372  VariantInit(vntPose.get());
1373  vntPose->vt = VT_BSTR;
1374  vntPose->bstrVal = ConvertStringToBSTR(goal->pose);
1375 
1376  hr = ExecMove(goal->comp, vntPose, goal->option);
1377 
1378  // Reset current action
1379  m_mtxAct.lock();
1380  if (m_curAct == ACT_MOVESTRING)
1381  {
1382  if (SUCCEEDED(hr))
1383  {
1384  res.HRESULT = S_OK;
1385  m_actMoveString->setSucceeded(res);
1386  }
1387  else
1388  {
1389  res.HRESULT = hr;
1390  m_actMoveString->setAborted(res);
1391  }
1392  m_curAct = ACT_NONE;
1393  }
1394  m_mtxAct.unlock();
1395 }
1396 
1397 void DensoRobot::Callback_MoveValue(const MoveValueGoalConstPtr& goal)
1398 {
1399  HRESULT hr;
1400  MoveValueResult res;
1401 
1402  // Set current action
1403  boost::mutex::scoped_lock lockAct(m_mtxAct);
1404  if (m_curAct != ACT_NONE)
1405  {
1406  if (m_curAct != ACT_RESET)
1407  {
1408  res.HRESULT = E_FAIL;
1409  m_actMoveValue->setAborted(res);
1410  }
1411  return;
1412  }
1414  lockAct.unlock();
1415 
1416  VARIANT_Ptr vntPose(new VARIANT());
1417  VariantInit(vntPose.get());
1418  CreatePoseData(goal->pose, *vntPose.get());
1419 
1420  hr = ExecMove(goal->comp, vntPose, goal->option);
1421 
1422  // Reset current action
1423  m_mtxAct.lock();
1424  if (m_curAct == ACT_MOVEVALUE)
1425  {
1426  if (SUCCEEDED(hr))
1427  {
1428  res.HRESULT = S_OK;
1429  m_actMoveValue->setSucceeded(res);
1430  }
1431  else
1432  {
1433  res.HRESULT = hr;
1434  m_actMoveValue->setAborted(res);
1435  }
1436  m_curAct = ACT_NONE;
1437  }
1438  m_mtxAct.unlock();
1439 }
1440 
1441 void DensoRobot::Callback_DriveString(const std::string& name, const DriveStringGoalConstPtr& goal)
1442 {
1443  HRESULT hr;
1444  DriveStringResult res;
1445  BSTR* pbstr;
1446 
1447  int act = 0;
1449 
1450  if (!name.compare("DriveEx"))
1451  {
1452  act = ACT_DRIVEEXSTRING;
1453  actSvr = m_actDriveExString;
1454  }
1455  else if (!name.compare("DriveAEx"))
1456  {
1457  act = ACT_DRIVEAEXSTRING;
1458  actSvr = m_actDriveAExString;
1459  }
1460  else
1461  return;
1462 
1463  // Set current action
1464  boost::mutex::scoped_lock lockAct(m_mtxAct);
1465  if (m_curAct != ACT_NONE)
1466  {
1467  if (m_curAct != ACT_RESET)
1468  {
1469  res.HRESULT = E_FAIL;
1470  actSvr->setAborted(res);
1471  }
1472  return;
1473  }
1474  m_curAct = act;
1475  lockAct.unlock();
1476 
1477  VARIANT_Ptr vntOpt(new VARIANT());
1478  VariantInit(vntOpt.get());
1479  vntOpt->vt = (VT_ARRAY | VT_BSTR);
1480  vntOpt->parray = SafeArrayCreateVector(VT_BSTR, 0, 2);
1481  SafeArrayAccessData(vntOpt->parray, (void**)&pbstr);
1482  pbstr[0] = ConvertStringToBSTR(goal->pose);
1483  pbstr[1] = ConvertStringToBSTR(goal->option);
1484  SafeArrayUnaccessData(vntOpt->parray);
1485 
1486  hr = ExecDrive(name, vntOpt);
1487 
1488  // Reset current action
1489  m_mtxAct.lock();
1490  if (m_curAct == act)
1491  {
1492  if (SUCCEEDED(hr))
1493  {
1494  res.HRESULT = S_OK;
1495  actSvr->setSucceeded(res);
1496  }
1497  else
1498  {
1499  res.HRESULT = hr;
1500  actSvr->setAborted(res);
1501  }
1502  m_curAct = ACT_NONE;
1503  }
1504  m_mtxAct.unlock();
1505 }
1506 
1507 void DensoRobot::Callback_DriveValue(const std::string& name, const DriveValueGoalConstPtr& goal)
1508 {
1509  HRESULT hr;
1510  DriveValueResult res;
1511  VARIANT *pvntval, *pvntjnt;
1512 
1513  int act = 0;
1515 
1516  if (!name.compare("DriveEx"))
1517  {
1518  act = ACT_DRIVEEXVALUE;
1519  actSvr = m_actDriveExValue;
1520  }
1521  else if (!name.compare("DriveAEx"))
1522  {
1523  act = ACT_DRIVEAEXVALUE;
1524  actSvr = m_actDriveAExValue;
1525  }
1526  else
1527  return;
1528 
1529  // Set current action
1530  boost::mutex::scoped_lock lockAct(m_mtxAct);
1531  if (m_curAct != ACT_NONE)
1532  {
1533  if (m_curAct != ACT_RESET)
1534  {
1535  res.HRESULT = E_FAIL;
1536  actSvr->setAborted(res);
1537  }
1538  return;
1539  }
1540  m_curAct = act;
1541  lockAct.unlock();
1542 
1543  VARIANT_Ptr vntOpt(new VARIANT());
1544  VariantInit(vntOpt.get());
1545 
1546  vntOpt->vt = (VT_ARRAY | VT_VARIANT);
1547  vntOpt->parray = SafeArrayCreateVector(VT_VARIANT, 0, 2);
1548 
1549  SafeArrayAccessData(vntOpt->parray, (void**)&pvntval);
1550 
1551  pvntval[0].vt = (VT_ARRAY | VT_VARIANT);
1552  pvntval[0].parray = SafeArrayCreateVector(VT_VARIANT, 0, goal->pose.size());
1553 
1554  SafeArrayAccessData(pvntval[0].parray, (void**)&pvntjnt);
1555 
1556  for (int i = 0; i < goal->pose.size(); i++)
1557  {
1558  PoseData pd;
1559  pd.value.push_back(goal->pose.at(i).joint);
1560  pd.value.push_back(goal->pose.at(i).value);
1561  pd.type = -1;
1562  pd.pass = (i == 0) ? goal->pass : 0;
1563  CreatePoseData(pd, pvntjnt[i]);
1564  }
1565 
1566  SafeArrayUnaccessData(pvntval[0].parray);
1567 
1568  pvntval[1].vt = VT_BSTR;
1569  pvntval[1].bstrVal = ConvertStringToBSTR(goal->option);
1570 
1571  SafeArrayUnaccessData(vntOpt->parray);
1572 
1573  hr = ExecDrive(name, vntOpt);
1574 
1575  // Reset current action
1576  m_mtxAct.lock();
1577  if (m_curAct == act)
1578  {
1579  if (SUCCEEDED(hr))
1580  {
1581  res.HRESULT = S_OK;
1582  actSvr->setSucceeded(res);
1583  }
1584  else
1585  {
1586  res.HRESULT = hr;
1587  actSvr->setAborted(res);
1588  }
1589  m_curAct = ACT_NONE;
1590  }
1591  m_mtxAct.unlock();
1592 }
1593 
1594 void DensoRobot::Callback_Speed(const Float32::ConstPtr& msg)
1595 {
1596  ExecSpeed(msg->data);
1597 }
1598 
1599 void DensoRobot::Callback_Change(const std::string& name, const Int32::ConstPtr& msg)
1600 {
1601  std::stringstream ss;
1602  ss << name << msg->data;
1603  ExecChange(ss.str());
1604 }
1605 
1607 {
1608  boost::mutex::scoped_lock lockAct(m_mtxAct);
1609 
1610  if (m_curAct > ACT_NONE)
1611  {
1612  ExecHalt();
1613 
1614  switch (m_curAct)
1615  {
1616  case ACT_MOVESTRING:
1617  m_actMoveString->setPreempted();
1618  break;
1619  case ACT_MOVEVALUE:
1620  m_actMoveValue->setPreempted();
1621  break;
1622  case ACT_DRIVEEXSTRING:
1623  m_actDriveExString->setPreempted();
1624  break;
1625  case ACT_DRIVEEXVALUE:
1626  m_actDriveExValue->setPreempted();
1627  break;
1628  case ACT_DRIVEAEXSTRING:
1629  m_actDriveAExString->setPreempted();
1630  break;
1631  case ACT_DRIVEAEXVALUE:
1632  m_actDriveAExValue->setPreempted();
1633  break;
1634  }
1635 
1636  m_curAct = ACT_NONE;
1637  }
1638 }
1639 
1641 {
1642  boost::mutex::scoped_lock lockAct(m_mtxAct);
1643 
1644  if (m_curAct > ACT_NONE)
1645  {
1646  HRESULT hr;
1647  std::vector<double> pose;
1648 
1649  MoveStringFeedback fbMvStr;
1650  MoveValueFeedback fbMvVal;
1651  DriveStringFeedback fbDrvStr;
1652  DriveValueFeedback fbDrvVal;
1653 
1654  hr = ExecCurJnt(pose);
1655 
1656  if (SUCCEEDED(hr))
1657  {
1658  switch (m_curAct)
1659  {
1660  case ACT_MOVESTRING:
1661  fbMvStr.pose = pose;
1662  m_actMoveString->publishFeedback(fbMvStr);
1663  break;
1664  case ACT_MOVEVALUE:
1665  fbMvVal.pose = pose;
1666  m_actMoveValue->publishFeedback(fbMvVal);
1667  break;
1668  case ACT_DRIVEEXSTRING:
1669  fbDrvStr.pose = pose;
1670  m_actDriveExString->publishFeedback(fbDrvStr);
1671  break;
1672  case ACT_DRIVEEXVALUE:
1673  fbDrvVal.pose = pose;
1674  m_actDriveExValue->publishFeedback(fbDrvVal);
1675  break;
1676  case ACT_DRIVEAEXSTRING:
1677  fbDrvStr.pose = pose;
1678  m_actDriveAExString->publishFeedback(fbDrvStr);
1679  break;
1680  case ACT_DRIVEAEXVALUE:
1681  fbDrvVal.pose = pose;
1682  m_actDriveAExValue->publishFeedback(fbDrvVal);
1683  break;
1684  }
1685  }
1686  }
1687 }
1688 
1689 } // namespace denso_robot_core
VT_UI1
HRESULT ExecSpeed(float value)
void ChangeArmGroup(int number)
HRESULT SafeArrayUnaccessData(SAFEARRAY *psa)
static constexpr const char * NAME_ARMGROUP
Definition: denso_robot.h:49
void put_HandIO(unsigned int value)
unsigned uint32_t
virtual HRESULT InitializeBCAP()
Definition: denso_base.h:104
HRESULT ExecDrive(const std::string &name, const VARIANT_Ptr &option)
void put_RecvFormat(int format)
SAFEARRAY * SafeArrayCreateVector(uint16_t vt, int32_t lLbound, uint32_t cElements)
void get_RecvUserIO(UserIO &value) const
std::vector< double > m_current
Definition: denso_robot.h:218
static constexpr const char * NAME_DRIVEAEXSTRING
Definition: denso_robot.h:54
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)
HRESULT ExecMove(int comp, const VARIANT_Ptr &pose, const std::string &option)
HRESULT ExecSlaveMove(const std::vector< double > &pose, std::vector< double > &joint)
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
HRESULT AddVariable(const std::string &name)
boost::shared_ptr< SimpleActionServer< DriveStringAction > > m_actDriveExString
Definition: denso_robot.h:201
HRESULT ExecSlaveMode(const std::string &name, int32_t format, int32_t option=0)
#define S_OK
DensoRobot(DensoBase *parent, Service_Vec &service, Handle_Vec &handle, const std::string &name, const int *mode)
Definition: denso_robot.cpp:48
ros::Subscriber m_subChangeWork
Definition: denso_robot.h:197
wchar_t * BSTR
void Callback_ArmGroup(const Int32::ConstPtr &msg)
ros::Subscriber m_subSpeed
Definition: denso_robot.h:195
ros::Subscriber m_subArmGroup
Definition: denso_robot.h:192
unsigned int get_MiniIO() const
std::vector< VARIANT, VariantAllocator< VARIANT > > VARIANT_Vec
std::vector< uint32_t > Handle_Vec
Definition: denso_base.h:67
#define ID_ROBOT_EXECUTE
void Callback_MoveValue(const MoveValueGoalConstPtr &goal)
void Callback_MoveString(const MoveStringGoalConstPtr &goal)
unsigned char uint8_t
std::vector< double > m_joint
Definition: denso_robot.h:218
boost::shared_ptr< SimpleActionServer< MoveStringAction > > m_actMoveString
Definition: denso_robot.h:199
#define FAILED(hr)
#define ROS_WARN(...)
static constexpr const char * NAME_DRIVEAEXVALUE
Definition: denso_robot.h:55
VT_I4
static constexpr const char * NAME_CHANGETOOL
Definition: denso_robot.h:57
HRESULT CreateSendParameter(const std::vector< double > &pose, VARIANT_Ptr &send, const int miniio=0, const int handio=0, const int recv_userio_offset=0, const int recv_userio_size=0, const int send_userio_offset=0, const int send_userio_size=0, const std::vector< uint8_t > &send_userio=std::vector< uint8_t >())
#define E_INVALIDARG
VT_BSTR
static constexpr const char * NAME_DRIVEEXSTRING
Definition: denso_robot.h:52
void put_SendUserIO(const UserIO &value)
static constexpr const char * NAME_MOVESTRING
Definition: denso_robot.h:50
std::vector< uint8_t > m_send_userio
Definition: denso_robot.h:217
ros::Subscriber m_subChangeTool
Definition: denso_robot.h:196
std::vector< BCAPService_Ptr > Service_Vec
Definition: denso_base.h:68
void VariantInit(VARIANT *pvarg)
void put_RecvUserIO(const UserIO &value)
static constexpr int BCAP_ROBOT_SPEED_ARGS
Definition: denso_robot.h:44
#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
std::string RosName() const
Definition: denso_base.cpp:61
#define MESSAGE_QUEUE
Definition: denso_base.h:61
static constexpr const char * NAME_DRIVEEXVALUE
Definition: denso_robot.h:53
BSTR SysAllocString(const wchar_t *sz)
VT_ARRAY
static constexpr const char * NAME_CHANGEWORK
Definition: denso_robot.h:58
#define ROS_INFO(...)
unsigned int get_HandIO() const
_DN_EXP_COMMON HRESULT VariantCopy(VARIANT *pvargDest, const VARIANT *pvargSrc)
VT_UI4
void Callback_Speed(const Float32::ConstPtr &msg)
static constexpr int BCAP_ROBOT_HALT_ARGS
Definition: denso_robot.h:42
boost::interprocess::unique_ptr< VARIANT, variant_deleter > VARIANT_Ptr
HRESULT ExecChange(const std::string &value)
SAFEARRAY * parray
HRESULT SafeArrayAccessData(SAFEARRAY *psa, void **ppvData)
VT_VARIANT
static BSTR ConvertStringToBSTR(const std::string &str)
Definition: denso_base.cpp:46
static constexpr int BCAP_ROBOT_MOVE_ARGS
Definition: denso_robot.h:43
#define SUCCEEDED(hr)
void set_SendFormat(int format)
DensoVariable_Vec m_vecVar
Definition: denso_robot.h:189
static constexpr const char * NAME_SPEED
Definition: denso_robot.h:56
HRESULT CreateExJoints(const ExJoints &exjoints, VARIANT &vnt)
void put_SendFormat(int format)
uint16_t vt
void get_Current(std::vector< double > &current) const
#define ID_ROBOT_GETVARIABLE
static constexpr int BCAP_ROBOT_EXECUTE_ARGS
Definition: denso_robot.h:41
HRESULT get_Object(const std::vector< boost::shared_ptr< DensoBase > > &vecBase, int index, boost::shared_ptr< DensoBase > *obj)
void Callback_Change(const std::string &name, const Int32::ConstPtr &msg)
VT_R8
virtual HRESULT ChangeMode(int mode)
HRESULT get_Variable(const std::string &name, DensoVariable_Ptr *var)
#define ID_ROBOT_CHANGE
const XMLElement * FirstChildElement(const char *value=0) const
Definition: tinyxml2.cpp:796
void put_TimeFormat(int format)
boost::shared_ptr< SimpleActionServer< DriveStringAction > > m_actDriveAExString
Definition: denso_robot.h:203
#define ID_ROBOT_SPEED
std::vector< double > m_position
Definition: denso_robot.h:218
boost::shared_ptr< SimpleActionServer< DriveValueAction > > m_actDriveExValue
Definition: denso_robot.h:202
void put_MiniIO(unsigned int value)
void set_RecvFormat(int format)
static constexpr const char * XML_VARIABLE_NAME
void Callback_DriveValue(const std::string &name, const DriveValueGoalConstPtr &goal)
int int32_t
HRESULT ParseRecvParameter(const VARIANT_Ptr &recv, std::vector< double > &position, std::vector< double > &joint, std::vector< double > &trans, int &miniio, int &handio, int &timestamp, std::vector< uint8_t > &recv_userio, std::vector< double > &current)
std::vector< double > m_trans
Definition: denso_robot.h:218
void Callback_DriveString(const std::string &name, const DriveStringGoalConstPtr &goal)
HRESULT StartService(ros::NodeHandle &node)
Definition: denso_robot.cpp:84
std::vector< DensoBase_Ptr > DensoBase_Vec
Definition: denso_base.h:166
VT_R4
#define ID_ROBOT_MOVE
boost::shared_ptr< SimpleActionServer< DriveValueAction > > m_actDriveAExValue
Definition: denso_robot.h:204
#define ID_ROBOT_HALT
static constexpr int BCAP_ROBOT_CHANGE_ARGS
Definition: denso_robot.h:45
static constexpr const char * NAME_MOVEVALUE
Definition: denso_robot.h:51
#define ROS_ERROR(...)
HRESULT CreatePoseData(const PoseData &pose, VARIANT &vnt)
boost::shared_ptr< SimpleActionServer< MoveValueAction > > m_actMoveValue
Definition: denso_robot.h:200
std::vector< uint8_t > m_recv_userio
Definition: denso_robot.h:217
HRESULT ExecCurJnt(std::vector< double > &pose)


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