denso_base.cpp
Go to the documentation of this file.
1 
25 #include <stdlib.h>
28 
29 namespace denso_robot_core
30 {
31 std::string DensoBase::ConvertBSTRToString(const BSTR bstr)
32 {
33  std::string strRet;
34  char* chTmp;
35 
36  chTmp = ConvertWideChar2MultiByte(bstr);
37  if (chTmp != NULL)
38  {
39  strRet = chTmp;
40  free(chTmp);
41  }
42 
43  return strRet;
44 }
45 
46 BSTR DensoBase::ConvertStringToBSTR(const std::string& str)
47 {
48  BSTR strRet = NULL;
49  wchar_t* chTmp;
50 
51  chTmp = ConvertMultiByte2WideChar(str.c_str());
52  if (chTmp != NULL)
53  {
54  strRet = SysAllocString(chTmp);
55  free(chTmp);
56  }
57 
58  return strRet;
59 }
60 
61 std::string DensoBase::RosName() const
62 {
63  std::string tmpName = m_name;
64 
65  // Replace space to _
66  std::replace(tmpName.begin(), tmpName.end(), ' ', '_');
67 
68  // Replace backslash to /
69  std::replace(tmpName.begin(), tmpName.end(), '\\', '/');
70 
71  // Erase @
72  size_t c;
73  while ((c = tmpName.find_first_of("@")) != std::string::npos)
74  {
75  tmpName.erase(c, 1);
76  }
77 
78  // Erase *
79  while ((c = tmpName.find_first_of("*")) != std::string::npos)
80  {
81  tmpName.erase(c, 1);
82  }
83 
84  return tmpName;
85 }
86 
87 HRESULT DensoBase::AddVariable(int32_t get_id, const std::string& name, DensoVariable_Vec& vecVar, int16_t vt,
88  bool bRead, bool bWrite, bool bID, int iDuration)
89 {
90  DensoBase_Vec vecBase;
91  vecBase.insert(vecBase.end(), vecVar.begin(), vecVar.end());
92 
93  if (E_HANDLE == get_Object(vecBase, name, NULL))
94  {
95  Handle_Vec vecHandle;
96  HRESULT hr = AddObject(get_id, name, vecHandle);
97  if (FAILED(hr))
98  return hr;
99 
100  DensoVariable_Ptr var(
101  new DensoVariable(this, m_vecService, vecHandle, name, m_mode, vt, bRead, bWrite, bID, iDuration));
102 
103  vecVar.push_back(var);
104  }
105 
106  return S_OK;
107 }
108 
109 HRESULT DensoBase::AddVariable(int32_t get_id, const XMLElement* xmlVar, DensoVariable_Vec& vecVar)
110 {
111  const char* chTmp;
112 
113  std::string name;
114  int16_t vt = VT_EMPTY;
115  bool bRead = false, bWrite = false, bID = false;
116  int iDuration = BCAP_VAR_DEFAULT_DURATION;
117 
118  name = xmlVar->GetText();
119 
121  if (chTmp != NULL)
122  vt = atoi(chTmp);
123 
124  chTmp = xmlVar->Attribute(DensoVariable::XML_ATTR_READ);
125  if (chTmp != NULL)
126  bRead = (strcasecmp(chTmp, "true") == 0);
127 
128  chTmp = xmlVar->Attribute(DensoVariable::XML_ATTR_WRITE);
129  if (chTmp != NULL)
130  bWrite = (strcasecmp(chTmp, "true") == 0);
131 
132  chTmp = xmlVar->Attribute(DensoVariable::XML_ATTR_ID);
133  if (chTmp != NULL)
134  bID = (strcasecmp(chTmp, "true") == 0);
135 
137  if (chTmp != NULL)
138  iDuration = atoi(chTmp);
139 
140  Handle_Vec vecHandle;
141  HRESULT hr = AddObject(get_id, name, vecHandle);
142  if (FAILED(hr))
143  return hr;
144 
145  DensoVariable_Ptr var(
146  new DensoVariable(this, m_vecService, vecHandle, name, m_mode, vt, bRead, bWrite, bID, iDuration));
147 
148  vecVar.push_back(var);
149 
150  return S_OK;
151 }
152 
153 HRESULT DensoBase::AddObject(int32_t get_id, const std::string& name, Handle_Vec& vecHandle)
154 {
155  int srvs, argc;
156  HRESULT hr;
157 
158  for (srvs = SRV_MIN; srvs <= SRV_MAX; srvs++)
159  {
160  VARIANT_Ptr vntRet(new VARIANT());
161  VARIANT_Vec vntArgs;
162 
163  VariantInit(vntRet.get());
164 
165  for (argc = 0; argc < BCAP_GET_OBJECT_ARGS; argc++)
166  {
167  VARIANT_Ptr vntTmp(new VARIANT());
168  VariantInit(vntTmp.get());
169 
170  switch (argc)
171  {
172  case 0:
173  vntTmp->vt = VT_UI4;
174  vntTmp->ulVal = m_vecHandle[srvs];
175  break;
176  case 1:
177  vntTmp->vt = VT_BSTR;
178  vntTmp->bstrVal = ConvertStringToBSTR(name);
179  break;
180  case 2:
181  vntTmp->vt = VT_BSTR;
182  vntTmp->bstrVal = SysAllocString(L"");
183  break;
184  }
185 
186  vntArgs.push_back(*vntTmp.get());
187  }
188 
189  hr = m_vecService[srvs]->ExecFunction(get_id, vntArgs, vntRet);
190  if (FAILED(hr))
191  break;
192 
193  vecHandle.push_back(vntRet->ulVal);
194  }
195 
196  return hr;
197 }
198 
200 {
201  uint32_t argc, i, num;
202  HRESULT hr;
203  VARIANT_Ptr vntRet(new VARIANT());
204  VARIANT_Vec vntArgs;
205 
206  VariantInit(vntRet.get());
207 
208  for (argc = 0; argc < BCAP_GET_OBJECTNAMES_ARGS; argc++)
209  {
210  VARIANT_Ptr vntTmp(new VARIANT());
211  VariantInit(vntTmp.get());
212 
213  if (argc == 0)
214  {
215  vntTmp->vt = VT_UI4;
216  vntTmp->ulVal = m_vecHandle[SRV_WATCH];
217  }
218  else
219  {
220  vntTmp->vt = VT_BSTR;
221  vntTmp->bstrVal = SysAllocString(L"");
222  }
223 
224  vntArgs.push_back(*vntTmp.get());
225  }
226 
227  hr = m_vecService[SRV_WATCH]->ExecFunction(func_id, vntArgs, vntRet);
228  if (SUCCEEDED(hr))
229  {
230  BSTR* pbstr;
231  VARIANT* pvnt;
232  switch (vntRet->vt)
233  {
234  case (VT_ARRAY | VT_BSTR):
235  num = vntRet->parray->rgsabound->cElements;
236  SafeArrayAccessData(vntRet->parray, (void**)&pbstr);
237  for (i = 0; i < num; i++)
238  {
239  vecName.push_back(ConvertBSTRToString(pbstr[i]));
240  }
241  SafeArrayUnaccessData(vntRet->parray);
242  break;
243  case (VT_ARRAY | VT_VARIANT):
244  num = vntRet->parray->rgsabound->cElements;
245  SafeArrayAccessData(vntRet->parray, (void**)&pvnt);
246  for (i = 0; i < num; i++)
247  {
248  if (pvnt[i].vt != VT_BSTR)
249  {
250  hr = E_FAIL;
251  break;
252  }
253  vecName.push_back(ConvertBSTRToString(pvnt[i].bstrVal));
254  }
255  SafeArrayUnaccessData(vntRet->parray);
256  break;
257  default:
258  hr = S_FALSE;
259  break;
260  }
261  }
262 
263  return hr;
264 }
265 
266 HRESULT DensoBase::get_Object(const DensoBase_Vec& vecBase, int index, DensoBase_Ptr* obj)
267 {
268  try
269  {
270  if (obj != NULL)
271  {
272  *obj = vecBase.at(index);
273  }
274  }
275  catch (std::out_of_range&)
276  {
277  return E_HANDLE;
278  }
279 
280  return S_OK;
281 }
282 
283 HRESULT DensoBase::get_Object(const DensoBase_Vec& vecBase, const std::string& name, DensoBase_Ptr* obj)
284 {
285  DensoBase_Vec::const_iterator it;
286  for (it = vecBase.begin(); it != vecBase.end(); it++)
287  {
288  if (!strcasecmp((*it)->Name().c_str(), name.c_str()))
289  {
290  if (obj != NULL)
291  {
292  *obj = *it;
293  }
294  return S_OK;
295  }
296  }
297 
298  return E_HANDLE;
299 }
300 
301 } // namespace denso_robot_core
#define S_FALSE
HRESULT SafeArrayUnaccessData(SAFEARRAY *psa)
short int16_t
unsigned uint32_t
static constexpr const char * XML_ATTR_VARTYPE
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)
static constexpr const char * XML_ATTR_ID
#define S_OK
uint32_t cElements
wchar_t * BSTR
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
static constexpr const char * XML_ATTR_WRITE
#define FAILED(hr)
#define E_HANDLE
VT_BSTR
VT_EMPTY
void VariantInit(VARIANT *pvarg)
const char * GetText() const
Definition: tinyxml2.cpp:1326
#define E_FAIL
int32_t HRESULT
std::string RosName() const
Definition: denso_base.cpp:61
BSTR SysAllocString(const wchar_t *sz)
VT_ARRAY
static std::string ConvertBSTRToString(const BSTR bstr)
Definition: denso_base.cpp:31
static constexpr const char * XML_ATTR_DURATION
std::vector< DensoVariable_Ptr > DensoVariable_Vec
VT_UI4
boost::interprocess::unique_ptr< VARIANT, variant_deleter > VARIANT_Ptr
SAFEARRAY * parray
HRESULT SafeArrayAccessData(SAFEARRAY *psa, void **ppvData)
VT_VARIANT
static BSTR ConvertStringToBSTR(const std::string &str)
Definition: denso_base.cpp:46
#define SUCCEEDED(hr)
static constexpr int BCAP_GET_OBJECT_ARGS
Definition: denso_base.h:73
HRESULT get_Object(const std::vector< boost::shared_ptr< DensoBase > > &vecBase, int index, boost::shared_ptr< DensoBase > *obj)
const char * Attribute(const char *name, const char *value=0) const
Definition: tinyxml2.cpp:1313
std::vector< std::string > Name_Vec
Definition: denso_base.h:66
int int32_t
SAFEARRAYBOUND rgsabound[1]
std::vector< DensoBase_Ptr > DensoBase_Vec
Definition: denso_base.h:166
static constexpr int BCAP_GET_OBJECTNAMES_ARGS
Definition: denso_base.h:74
#define BCAP_VAR_DEFAULT_DURATION
Definition: denso_base.h:62
_DN_EXP_COMMON char * ConvertWideChar2MultiByte(const wchar_t *chSrc)
HRESULT AddObject(int32_t get_id, const std::string &name, Handle_Vec &vecHandle)
Definition: denso_base.cpp:153
static constexpr const char * XML_ATTR_READ
_DN_EXP_COMMON wchar_t * ConvertMultiByte2WideChar(const char *chSrc)


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