OpcUaCanOpen
CANopen OPC-UA server
UaControlDeviceItem.h
Go to the documentation of this file.
1 #ifndef __UACONTROLVARIABLE_H__
2 #define __UACONTROLVARIABLE_H__
3 
4 #include "uaobjecttypes.h"
5 #include "uabasenodes.h"
6 #include <opcua_dataitemtype.h>
7 #include <opcua_basedatavariabletype.h>
8 #include "CanOpenData.h"
9 #include "boost/bind.hpp"
10 #include "boost/signals2.hpp"
11 #include <map>
12 #include "CANOpenServerConfig.h"
13 #include "InterfaceUserDataBase.h"
14 #include "srvtrace.h"
15 #include <opcua_baseobjecttype.h>
16 
17 namespace AddressSpace
18 {
19  class NmBuildingAutomation;
20  class UaControlNode;
25  public OpcUa::BaseDataVariableType
26  {
28  public:
38  UaNode *cur,
39  NmBuildingAutomation* pNodeManager,
40  UaVariable *instance,
41  UaMutexRefCounted* pSharedMutex
42  );
43 
45  const UaString& name,
46  const UaNodeId& newNodeId,
47  NmBuildingAutomation* pNodeManager,
48  UaVariant &dv,
49  UaMutexRefCounted* pSharedMutex
50  );
51 
53  {
54  //UserDevice::InterfaceUserDataBase * iudb = (UserDevice::InterfaceUserDataBase*)getUserData();
55 
56  //if (iudb) {
57  // iudb->releaseMutex();
58  // if (iudb->countMutex() == 0)
59  // delete iudb;
60  // setUserData(0);
61 
62  //}
63 // OpcUa::BaseDataVariableType::~BaseDataVariableType();
64  }
65 
66  virtual UaStatus write(UaDataValue &udv) {
67  return setValue(0, udv, false);
68  }
69 
70  virtual UaStatus read() {
71  return OpcUa_Good;
72  }
73 
74 
82  virtual UaStatus setValue(Session *pSession,const UaDataValue& dataValue,OpcUa_Boolean checkAccessLevel)
83  {
84  UaStatus ret;
85 
86  convertToDouble(dataValue);
87  ret = OpcUa::BaseDataVariableType::setValue(pSession, dataValue, checkAccessLevel);
88 // TRACE1_DATA(SERVER_CORE, UA_T"<-- UaCalcItem::callCalculation %s", this->browseName().toString().toUtf8());
89  valueChange(pSession, dataValue, checkAccessLevel); // send signal
90  return ret;
91  }
99  virtual UaStatus setValueOnChange(Session *pSession, const UaDataValue& dataValue, OpcUa_Boolean checkAccessLevel)
100  {
101  UaStatus ret;
102 
103  convertToDouble(dataValue);
104 
105  ret = OpcUa::BaseDataVariableType::setValue(pSession, dataValue, checkAccessLevel);
106 // TRACE1_DATA(SERVER_CORE, UA_T"<-- UaControlDevicetem::setItem %s", browseName().toString().toUtf8());
107  valueChange(pSession, dataValue, checkAccessLevel); // send signal
108  return ret;
109  }
110 
111  virtual void connectItem(UaControlVariable *item)
112  {
113  boost::arg<1> _1;
114  boost::arg<2> _2;
115  boost::arg<3> _3;
116 // boost::arg<4> _4;
117 // TRACE2_DATA(SERVER_CORE, UA_T"<-- UaControlDevicetem::connectItem %s %s", browseName().toString().toUtf8(), item->browseName().toString().toUtf8());
118  item->valueChange.connect(boost::bind(&UaControlVariable::setValueOnChange, this, _1,_2,_3));
119 // item->valueChange.connect(&UaControlVariable::setValueOnChange);
120 
121  }
123  virtual UaNodeId typeDefinitionId() const { return m_TypeDefinition; }
124 
128  virtual void setTypeDefinition( UaNodeId uni) { m_TypeDefinition = uni; }
129 
133  boost::signals2::signal<void(Session *pSession, const UaDataValue& dataValue, OpcUa_Boolean checkAccessLevel) > valueChange;
134 
135  void convertToDouble(const UaDataValue &dataValue)
136  //void convertToDouble(void)
137  {
138 // double res = 0.0;
139  const OpcUa_Variant *val = dataValue.value();
140 
141  switch (val->Datatype) {
142  case OpcUaType_Boolean:
143  curValue = val->Value.Boolean;
144  break;
145  case OpcUaType_SByte:
146  curValue = val->Value.SByte;
147  break;
148  case OpcUaType_Byte:
149  curValue = val->Value.Byte;
150  break;
151  case OpcUaType_Int16:
152  curValue = val->Value.Int16;
153  break;
154  case OpcUaType_UInt16:
155  curValue = val->Value.UInt16;
156  break;
157  case OpcUaType_Int32:
158  curValue = val->Value.Int32;
159  break;
160  case OpcUaType_UInt32:
161  curValue = val->Value.UInt32;
162  break;
163  case OpcUaType_Int64:
164  curValue = (double)val->Value.Int64;
165  break;
166  case OpcUaType_UInt64:
167  curValue = (double)val->Value.UInt64;
168  break;
169  case OpcUaType_Float:
170  curValue = val->Value.Float;
171  break;
172  case OpcUaType_Double:
173  curValue = val->Value.Double;
174  break;
175  default:
176 // throw 1;
177  curValue = 0.0;
178  };
179 // curValue = res;
180  }
181  OpcUa_Double curValue;
182 
183  private:
184  UaNodeId m_TypeDefinition;
185 
186  };
187 
188 
194  public UaControlVariable
195  {
197  public:
198 
212  UaNode *cur,
213  NmBuildingAutomation* pNodeManager,
214  UaVariable *instance,
217  UaMutexRefCounted* pSharedMutex
218  );
219 
232  const UaString& name,
233  const UaNodeId& newNodeId,
234  NmBuildingAutomation* pNodeManager,
235  UaVariant &dv,
236  UaVariableType *instance,
239  UaMutexRefCounted* pSharedMutex
240  );
241 
242  virtual UaStatus write(UaDataValue &udv);
243 
245  virtual UaStatus read();
246 
251  virtual UaStatus read(IOVariableCallback *iom);
252 
255  switch(ac) {
256  case CAN_IN:
257  setValueHandling(UaVariable_Value_CacheIsSource);
258  setAccessLevel(Ua_AccessLevel_CurrentRead );
259  break;
260  case CAN_OUT:
261  setValueHandling(UaVariable_Value_Cache);
262  setAccessLevel(Ua_AccessLevel_CurrentWrite);
263  break;
264  case CAN_IO:
265  setValueHandling(UaVariable_Value_Cache);
266  setAccessLevel(Ua_AccessLevel_CurrentRead | Ua_AccessLevel_CurrentWrite);
267  break;
268  }
269  }
270 
271  virtual void addMethod(OpcUa::BaseMethod* meth) { m_pMethod.push_back(meth); }
272  protected:
273  std::vector<OpcUa::BaseMethod*> m_pMethod;
274 // UaControlNode m_cFunction;
275  };
276 }
277 #endif
278