OpcUaCanOpen
CANopen OPC-UA server
UaControlDeviceItem.hpp
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;
24  class UaControlVariable :
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  TRACE2_DATA(SERVER_CORE, UA_T"<-- UaControlDevicetem::connectItem %s %s", browseName().toString().toUtf8(), item->browseName().toString().toUtf8());
117  item->valueChange.connect(boost::bind(&UaControlVariable::setValueOnChange, this, _1,_2,_3));
118 // item->valueChange.connect(&UaControlVariable::setValueOnChange);
119 
120  }
122  virtual UaNodeId typeDefinitionId() const { return m_TypeDefinition; }
123 
127  virtual void setTypeDefinition( UaNodeId uni) { m_TypeDefinition = uni; }
128 
132  boost::signals2::signal<void(Session *pSession, const UaDataValue& dataValue, OpcUa_Boolean checkAccessLevel) > valueChange;
133 
134  void convertToDouble(const UaDataValue &dataValue)
135  //void convertToDouble(void)
136  {
137 // double res = 0.0;
138  const OpcUa_Variant *val = dataValue.value();
139 
140  switch (val->Datatype) {
141  case OpcUaType_Boolean:
142  curValue = val->Value.Boolean;
143  break;
144  case OpcUaType_SByte:
145  curValue = val->Value.SByte;
146  break;
147  case OpcUaType_Byte:
148  curValue = val->Value.Byte;
149  break;
150  case OpcUaType_Int16:
151  curValue = val->Value.Int16;
152  break;
153  case OpcUaType_UInt16:
154  curValue = val->Value.UInt16;
155  break;
156  case OpcUaType_Int32:
157  curValue = val->Value.Int32;
158  break;
159  case OpcUaType_UInt32:
160  curValue = val->Value.UInt32;
161  break;
162  case OpcUaType_Int64:
163  curValue = (double)val->Value.Int64;
164  break;
165  case OpcUaType_UInt64:
166  curValue = (double)val->Value.UInt64;
167  break;
168  case OpcUaType_Float:
169  curValue = val->Value.Float;
170  break;
171  case OpcUaType_Double:
172  curValue = val->Value.Double;
173  break;
174  default:
175 // throw 1;
176  curValue = 0.0;
177  };
178 // curValue = res;
179  }
180  OpcUa_Double curValue;
181 
182  private:
183  UaNodeId m_TypeDefinition;
184 
185  };
186 
187 
192  class UaControlDeviceItem :
193  public UaControlVariable
194  {
196  public:
197 
211  UaNode *cur,
212  NmBuildingAutomation* pNodeManager,
213  UaVariable *instance,
216  UaMutexRefCounted* pSharedMutex
217  );
218 
231  const UaString& name,
232  const UaNodeId& newNodeId,
233  NmBuildingAutomation* pNodeManager,
234  UaVariant &dv,
235  UaVariableType *instance,
238  UaMutexRefCounted* pSharedMutex
239  );
240 
241  virtual UaStatus write(UaDataValue &udv);
242 
244  virtual UaStatus read();
245 
250  virtual UaStatus read(IOVariableCallback *iom);
251 
254  switch(ac) {
255  case CAN_IN:
256  setValueHandling(UaVariable_Value_CacheIsSource);
257  setAccessLevel(Ua_AccessLevel_CurrentRead );
258  break;
259  case CAN_OUT:
260  setValueHandling(UaVariable_Value_Cache);
261  setAccessLevel(Ua_AccessLevel_CurrentWrite);
262  break;
263  case CAN_IO:
264  setValueHandling(UaVariable_Value_Cache);
265  setAccessLevel(Ua_AccessLevel_CurrentRead | Ua_AccessLevel_CurrentWrite);
266  break;
267  }
268  }
269 
270  virtual void addMethod(OpcUa::BaseMethod* meth) { m_pMethod.push_back(meth); }
271  protected:
272  std::vector<OpcUa::BaseMethod*> m_pMethod;
273 // UaControlNode m_cFunction;
274  };
275 }
276 #endif
277