OpcUaCanOpen
CANopen OPC-UA server
CanBusObject.cpp
Go to the documentation of this file.
1 //#include "BuildingAutomationTypeIds.h"
2 #include "CanBusInterface.h"
3 
4 #include "CanBusObject.h"
5 //#include "CCanUACallback.h"
6 
7 
8 namespace CanOpen
9 {
10 
11  CanBusObject::CanBusObject(pUserDeviceStruct *parent,CANBUS *ca,UaNode *blink,int code)
12  : CanObject(parent,ca,blink,code)
13  {
14  m_sBusName = ca->name();
15  m_sBusParameters = ca->speed();
16  m_sBusAddress = ca->type() +":" + ca->port();
17  setInitNmt((ca->nmt() == NULL) ? string() : ca->nmt().get());
18  m_pCallback = new CCanUACallback(this);
19 
20  }
21 
23  {
25  }
26 
28  {
30  if (m_pCommIf)
31  // Create the the callback interface for input messages
33  else {
34  LOG(Log::INF) << " bus=" << m_sBusName.data() << " status bad " << "Could not open the bus ";
35  if (!noExit) {
36  exit(-1);
37  }
38  }
39  }
40 
42  {
43 // LOG(Log::INF) << "Close Synch";
44  if (m_pSyncIn) {
45  delete m_pSyncIn;
46  m_pSyncIn = NULL;
47  }
48 // LOG(Log::INF) << "Close NG";
49 
50  if (m_pNgIn) {
51  delete m_pNgIn;
52  m_pNgIn = NULL;
53  }
54 
55 // LOG(Log::INF) << " bus=" << m_sBusName.data() << " Close the bus ";
56 
57 
58  if (m_pCommIf) {
60  // Delete the the callback interface for input messages
61  if (m_pCallback) {
62  delete m_pCallback;
63  m_pCallback = NULL;
64  }
65  }
66  m_pCommIf = NULL;
67 // LOG(Log::INF) << "Close CallBack";
68 
69  }
70 
72  {
73 // LOG(Log::INF) << "Del Interface";
74 
75  closeCanBus();
76 
77  if (m_pSyncIn) {
78  delete m_pSyncIn;
79  m_pSyncIn = NULL;
80  }
81  if (m_pNgIn) {
82  delete m_pNgIn;
83  m_pNgIn = NULL;
84  }
85  if (m_pCommIf) {
86  if (m_pCallback) {
87  delete m_pCallback;
88  m_pCallback = NULL;
89  }
90  delete m_pCommIf;
91  m_pCommIf = NULL;
92  }
93 
94  }
95 
96  UaStatus CanBusObject::sendDeviceMessage(OpcUa_UInt32 code, UaDataValue *value)
97  {
98  UaStatus ret = OpcUa_Good;
99  string nameMethod;
100 
101  lock();
102  switch (code) {
103  case BA_CANOBJECT_START:
104  nameMethod = "NMT Start";
105  sendNMT(start);
106  break;
107  case BA_CANOBJECT_STOP:
108  nameMethod = "NMT Stop";
109  sendNMT(stop);
110  break;
112  nameMethod = "NMT PreOperation";
114  break;
115  case BA_CANOBJECT_RESET:
116  nameMethod = "NMT Reset";
117  sendNMT(reset);
118  break;
119  case BA_CANBUS_SYNCH:
120  nameMethod = "Synch";
121  sendSync();
122  break;
124  {
125  nameMethod = "Synch";
126 
127  OpcUa_Boolean command = value->value()->Value.Byte;
128  if (command)
129  sendSync();
130  }
131  break;
132  case BA_CANOBJECT_NMT:
133  {
134  OpcUa_Byte command = value->value()->Value.Byte;
135  nameMethod = "NMT " + command;
136  sendNMT((::NMTcommand)command);
137  }
138  break;
139  default:
140  ret = OpcUa_Bad;
141  }
142  LOG(Log::DBG, NMTMessage) << " bus=" << getCanBusName() << "node=0" << " phase=" << nameMethod;
143 
144  unlock();
145  return ret;
146  }
147 
148  UaStatus CanBusObject::connectCode(OpcUa_UInt32 code, ::xsd::cxx::tree::type *conf, UaNode *blink)
149  {
150  UaDataValue udt;
151  UaVariant val;
152  OpcUa::BaseDataVariableType * linkObject = static_cast<OpcUa::BaseDataVariableType *>(blink);
153  UaDateTime sdt = UaDateTime::now();
154  CANBUS *canb = (CANBUS *)conf;
155  switch (code) {
156 
157  case BA_CANOBJECT_NMT:
158  linkObject->setDataType(OpcUaType_UInt32);
159  val.setUInt32(0);
160  udt.setDataValue(val, OpcUa_False, OpcUa_Good, sdt, sdt);
161  linkObject->setValue(0, udt, OpcUa_False);
162  linkObject->setValueHandling(UaVariable_Value_Cache);
163  break;
165  linkObject->setDataType(OpcUaType_UInt32);
166  val.setUInt32(0);
167  udt.setDataValue(val,OpcUa_False,OpcUa_Good,sdt,sdt);
168  linkObject->setValue(0,udt,OpcUa_False);
169  linkObject->setValueHandling(UaVariable_Value_Cache);
170  break;
171 
173  linkObject->setDataType(OpcUaType_UInt32);
174  if (canb->SYNC()) {
175  val.setUInt32(canb->SYNC().get().interval());
176  }
177  else
178  {
179  val.setUInt32(0);
180  }
181  udt.setDataValue(val, OpcUa_False, OpcUa_Good, sdt, sdt);
182  linkObject->setValue(0, udt, OpcUa_False);
183  m_pSyncIn = new SyncInterval(this, linkObject);
184  if (!m_pSyncIn) return OpcUa_Bad;
185  break;
187  linkObject->setDataType(OpcUaType_UInt32);
188  if (canb->NODEGUARD())
189  {
190  val.setUInt32(canb->NODEGUARD().get().interval());
191  }
192  else
193  {
194  val.setUInt32(0);
195  }
196  udt.setDataValue(val, OpcUa_False, OpcUa_Good, sdt, sdt);
197  linkObject->setValue(0, udt, OpcUa_False);
198  m_pNgIn = new NodeGuardingInterval(this, linkObject);
199  if (!m_pNgIn) return OpcUa_Bad;
200  break;
201  case BA_CANBUS_PORTERROR:
202  m_iPortError = linkObject;
203  val.setUInt32(canb->NODEGUARD().get().interval());
204  val.setUInt32(0);
205  udt.setDataValue(val, OpcUa_False, OpcUa_Good, sdt, sdt);
206  linkObject->setValue(0, udt, OpcUa_False);
207  break;
209  m_sPortErrorDescription = linkObject;
210  val.setString(UaString(""));
211  udt.setDataValue(val, OpcUa_False, OpcUa_Good, sdt, sdt);
212  linkObject->setValue(0, udt, OpcUa_False);
213  break;
214  //case BA_CANBUS_PORT:
215  // val.setString(UaString(canb->port().c_str()));
216  // udt.setDataValue(val, OpcUa_False, OpcUa_Good, sdt, sdt);
217  // linkObject->setValue(0, udt, OpcUa_False);
218  // break;
219  //case BA_CANBUS_TYPE:
220  // val.setString(UaString(canb->type().c_str()));
221  // udt.setDataValue(val, OpcUa_False, OpcUa_Good, sdt, sdt);
222  // linkObject->setValue(0, udt, OpcUa_False);
223 
224  // break;
225  //case BA_CANBUS_SPEED:
226  // val.setString(UaString(canb->speed().c_str()));
227  // udt.setDataValue(val, OpcUa_False, OpcUa_Good, sdt, sdt);
228  // linkObject->setValue(0, udt, OpcUa_False);
229 
230  // break;
231 
232  default:
233  return OpcUa_Bad;
234  }
235  return OpcUa_Good;
236  }
237 
239  {
240  UaVariant val;
241  val.clear();
242  CANBUS *canb = (CANBUS *)conf;
243  switch (code) {
244 
245  case BA_CANBUS_PORT:
246  val.setString(UaString(canb->port().c_str()));
247  break;
248  case BA_CANBUS_TYPE:
249  val.setString(UaString(canb->type().c_str()));
250  break;
251  case BA_CANBUS_SPEED:
252  val.setString(UaString(canb->speed().c_str()));
253  break;
254  }
255  return val;
256  }
257 
258  void CanBusObject::setPortError(const int err, const char *errmsg, timeval &tv)
259  {
260  UaDataValue dataValue;
261  UaDateTime udt,sdt;
262  UaVariant val;
263  UaStatus Status;
264 
265  udt = UaDateTime::fromTime_t(tv.tv_sec); // Time from can message
266  udt.addMilliSecs(tv.tv_usec/1000);
267  sdt = UaDateTime::now(); // server time
268 
269  val.setInt32(err);
270  dataValue.setDataValue(val,OpcUa_False,OpcUa_Good,udt,sdt);
271  Status = m_iPortError->setValue(NULL, dataValue, OpcUa_False);
272  val.setString(errmsg);
273  dataValue.setDataValue(val,OpcUa_False,OpcUa_Good,udt,sdt);
274  Status = m_sPortErrorDescription->setValue(NULL, dataValue, OpcUa_False);
275 
276  }
277 
279  {
280 
281  if (m_initNMTcommand == start)
283  else
285  }
286 
287 }