denso_controller_rc9.cpp
Go to the documentation of this file.
1 
25 
26 namespace denso_robot_core
27 {
28 DensoControllerRC9::DensoControllerRC9(const std::string& name, const int* mode, const ros::Duration dt)
29  : DensoController(name, mode, dt)
30 {
31 }
32 
34 {
35 }
36 
38 {
39  static const std::string CTRL_CONNECT_OPTION[BCAP_CONTROLLER_CONNECT_ARGS]
40  = { "", "CaoProv.DENSO.VRC9", "localhost", "" };
41 
42  HRESULT hr = E_FAIL;
43  int srvs, argc;
44 
45  if (m_duration != ros::Duration(0.008))
46  {
47  ROS_ERROR("Invalid argument value [bcap_slave_control_cycle_msec]");
48  return E_INVALIDARG;
49  }
50 
51  for (srvs = DensoBase::SRV_MIN; srvs <= DensoBase::SRV_MAX; srvs++)
52  {
53  std::stringstream ss;
54  std::string strTmp;
55  VARIANT_Ptr vntRet(new VARIANT());
56  VARIANT_Vec vntArgs;
57 
58  VariantInit(vntRet.get());
59 
60  for (argc = 0; argc < BCAP_CONTROLLER_CONNECT_ARGS; argc++)
61  {
62  VARIANT_Ptr vntTmp(new VARIANT());
63  VariantInit(vntTmp.get());
64 
65  vntTmp->vt = VT_BSTR;
66 
67  if (argc == 0)
68  {
69  strTmp = "";
70  if (m_name != "")
71  {
72  ss << ros::this_node::getNamespace() << m_name << srvs;
73  strTmp = ss.str();
74  }
75  }
76  else
77  {
78  strTmp = CTRL_CONNECT_OPTION[argc];
79  }
80 
81  vntTmp->bstrVal = ConvertStringToBSTR(strTmp);
82 
83  vntArgs.push_back(*vntTmp.get());
84  }
85 
86  hr = m_vecService[srvs]->ExecFunction(ID_CONTROLLER_CONNECT, vntArgs, vntRet);
87  if (FAILED(hr))
88  break;
89 
90  m_vecHandle.push_back(vntRet->ulVal);
91  }
92 
93  return hr;
94 }
95 
97 {
98  int objs;
99  HRESULT hr;
100 
101  Name_Vec vecName;
103  if (SUCCEEDED(hr))
104  {
105  for (objs = 0; objs < vecName.size(); objs++)
106  {
107  Handle_Vec vecHandle;
108  hr = DensoBase::AddObject(ID_CONTROLLER_GETROBOT, vecName[objs], vecHandle);
109  if (FAILED(hr))
110  break;
111 
112  DensoRobot_Ptr rob(new DensoRobotRC9(this, m_vecService, vecHandle, vecName[objs], m_mode));
113  hr = rob->InitializeBCAP(xmlElem);
114  if (FAILED(hr))
115  break;
116 
117  m_vecRobot.push_back(rob);
118  }
119  }
120 
121  return hr;
122 }
123 
125 {
126  if (robot == NULL)
127  {
128  return E_INVALIDARG;
129  }
130 
131  DensoBase_Vec vecBase;
132  vecBase.insert(vecBase.end(), m_vecRobot.begin(), m_vecRobot.end());
133 
134  DensoBase_Ptr pBase;
135  HRESULT hr = DensoBase::get_Object(vecBase, index, &pBase);
136  if (SUCCEEDED(hr))
137  {
138  *robot = boost::dynamic_pointer_cast<DensoRobotRC9>(pBase);
139  }
140 
141  return hr;
142 }
143 
152 {
153  /*
154  * RC9 v1.4.x or later: ManualReset
155  * RC9 v1.3.x or earlier: ResetStoState
156  */
157  std::tuple<int, int, int> min_version = std::make_tuple(1, 4, 0);
158  std::tuple<int, int, int> current_version = get_SoftwareVersion();
159  if (current_version < min_version)
160  {
161  return ExecResetStoState();
162  }
163 
164  int argc;
165  VARIANT_Vec vntArgs;
166  VARIANT_Ptr vntRet(new VARIANT());
167 
168  for (argc = 0; argc < BCAP_CONTROLLER_EXECUTE_ARGS; argc++)
169  {
170  VARIANT_Ptr vntTmp(new VARIANT());
171 
172  VariantInit(vntTmp.get());
173 
174  switch (argc)
175  {
176  case 0:
177  vntTmp->vt = VT_I4;
178  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_WATCH];
179  break;
180  case 1:
181  vntTmp->vt = VT_BSTR;
182  vntTmp->bstrVal = SysAllocString(L"ManualReset");
183  break;
184  }
185 
186  vntArgs.push_back(*vntTmp.get());
187  }
188 
189  return m_vecService[DensoBase::SRV_WATCH]->ExecFunction(ID_CONTROLLER_EXECUTE, vntArgs, vntRet);
190 }
191 
200 {
201  int argc;
202  VARIANT_Vec vntArgs;
203  VARIANT_Ptr vntRet(new VARIANT());
204 
205  for (argc = 0; argc < BCAP_CONTROLLER_EXECUTE_ARGS; argc++)
206  {
207  VARIANT_Ptr vntTmp(new VARIANT());
208 
209  VariantInit(vntTmp.get());
210 
211  switch (argc)
212  {
213  case 0:
214  vntTmp->vt = VT_I4;
215  vntTmp->ulVal = m_vecHandle[DensoBase::SRV_WATCH];
216  break;
217  case 1:
218  vntTmp->vt = VT_BSTR;
219  vntTmp->bstrVal = SysAllocString(L"ResetStoState");
220  break;
221  }
222 
223  vntArgs.push_back(*vntTmp.get());
224  }
225 
226  return m_vecService[DensoBase::SRV_WATCH]->ExecFunction(ID_CONTROLLER_EXECUTE, vntArgs, vntRet);
227 }
228 
229 } // namespace denso_robot_core
#define ID_CONTROLLER_GETROBOTNAMES
#define ID_CONTROLLER_EXECUTE
#define ID_CONTROLLER_CONNECT
std::vector< VARIANT, VariantAllocator< VARIANT > > VARIANT_Vec
std::vector< uint32_t > Handle_Vec
Definition: denso_base.h:67
HRESULT AddRobot(XMLElement *xmlElem)
HRESULT GetObjectNames(int32_t func_id, Name_Vec &vecName)
Definition: denso_base.cpp:199
#define FAILED(hr)
VT_I4
#define E_INVALIDARG
VT_BSTR
void VariantInit(VARIANT *pvarg)
virtual HRESULT ExecManualReset() override
#define E_FAIL
int32_t HRESULT
ROSCPP_DECL const std::string & getNamespace()
virtual HRESULT ExecResetStoState() override
BSTR SysAllocString(const wchar_t *sz)
boost::interprocess::unique_ptr< VARIANT, variant_deleter > VARIANT_Ptr
std::tuple< int, int, int > get_SoftwareVersion() const
static BSTR ConvertStringToBSTR(const std::string &str)
Definition: denso_base.cpp:46
#define SUCCEEDED(hr)
HRESULT get_Object(const std::vector< boost::shared_ptr< DensoBase > > &vecBase, int index, boost::shared_ptr< DensoBase > *obj)
std::vector< std::string > Name_Vec
Definition: denso_base.h:66
HRESULT get_Robot(int index, DensoRobotRC9_Ptr *robot)
std::vector< DensoBase_Ptr > DensoBase_Vec
Definition: denso_base.h:166
#define ID_CONTROLLER_GETROBOT
DensoControllerRC9(const std::string &name, const int *mode, const ros::Duration dt)
static constexpr int BCAP_CONTROLLER_CONNECT_ARGS
HRESULT AddObject(int32_t get_id, const std::string &name, Handle_Vec &vecHandle)
Definition: denso_base.cpp:153
#define ROS_ERROR(...)
static constexpr int BCAP_CONTROLLER_EXECUTE_ARGS


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