OpcUaCanOpen
CANopen OPC-UA server
CCanUACallback.cpp
Go to the documentation of this file.
1 #include "CANopen.h"
2 #include "CCanUACallback.h"
3 #include "CanNodeObject.h"
4 #include "CanPDOObject.h"
5 #include "CanOpenObject.h"
6 #include "UaCanTrace.h"
7 #include <time.h>
8 
9 //using namespace AddressSpace;
10 
11 namespace CanOpen
12 {
14  {
15 // boost::arg<1> _1;
16 // boost::arg<2> _2;
17 // boost::arg<3> _3;
18  cBus = cB;
19 // cBus->getCanBusInterface()->canMessageCame.connect(boost::bind<void>(&CCanUACallback::FireOnChange,this,_1));
20 // cBus->getCanBusInterface()->canMessageError.connect(boost::bind<void>(&CCanUACallback::FireOnError,this,_1,_2,_3));
21  }
22 
24  {
25  cout << " Delete Callback";
26 
27 // cBus->getCanBusInterface()->canMessageCame.disconnect(boost::bind<void>(&CCanUACallback::FireOnChange));
28 // cBus->getCanBusInterface()->canMessageError.disconnect(boost::bind<void>(&CCanUACallback::FireOnError));
29  PDOs.clear();
30 
31 // for (map<OpcUa_UInt16, CanNodeObject *>::iterator itn = NODEs.begin(); itn != NODEs.end(); itn++)
32 // delete (*itn).second;
33 
34  NODEs.clear();
35  }
36 
38  {
39  boost::arg<1> _1;
40  boost::arg<2> _2;
41  boost::arg<3> _3;
43 
44  for(map<OpcUa_UInt16,CanNodeObject *>::iterator itn= NODEs.begin(); itn !=NODEs.end(); itn++)
45  (*itn).second->setCanBusInterface(cca);
46 
47  cca->canMessageCame.connect(boost::bind(&CCanUACallback::FireOnChange,this,_1));
48  cca->canMessageError.connect(boost::bind(&CCanUACallback::FireOnError,this,_1,_2,_3));
49  }
50 
52  {
53  bool rRet = true;
54  busPdos::iterator it;
55  busNodes::iterator itn;
56 
57  OpcUa_UInt32 canopen_obj = cms.c_id & CANOPEN_OBJECT_MASK;
58  OpcUa_UInt16 canopen_nodeid = cms.c_id & CANOPEN_NODEID_MASK;
59 
60  switch (canopen_obj) {
62  // Emergency message
63  itn = NODEs.find(canopen_nodeid);
64  LOG(Log::DBG, EmergMessage) << " bus=" << cBus->getCanBusName().c_str() << " input " << UaCanTrace::pdomes(cms);
65  if (itn != NODEs.end() )
66  (*itn).second->setEmergencyEvent(&cms);
67  break;
68  case CANOPEN_TPDO1_COBID: // PDO message
69  LOG(Log::DBG, Pdo1Message) << " bus=" << cBus->getCanBusName() << " phase=input " << UaCanTrace::pdomes(cms);
72  LOG(Log::DBG, Pdo2Message) << " bus=" << cBus->getCanBusName() << " phase=input " << UaCanTrace::pdomes(cms);
75  LOG(Log::DBG, Pdo3Message) << " bus=" << cBus->getCanBusName() << " phase=input " << UaCanTrace::pdomes(cms);
78  LOG(Log::DBG, Pdo4Message) << " bus=" << cBus->getCanBusName() << " phase=input " << UaCanTrace::pdomes(cms);
80 
81  LOG(Log::DBG, PdoMessage) << " bus=" << cBus->getCanBusName() << " phase=input " << UaCanTrace::pdomes(cms);
82 
83  it = PDOs.find(cms.c_id);
84  if (it != PDOs.end() ) {
85  (*it).second->pass(&cms);
86  }
87  break;
89  {
90 // UaCanTrace::tSdoMessage(" SDO message came %d func %2x index=%2x%2x subindex=%x", cms.c_id, cms.c_data[0], cms.c_data[2], cms.c_data[1], cms.c_data[3]);
91  LOG(Log::DBG, SdoMessage) << " bus=" << cBus->getCanBusName() << " phase=input " << std::hex << (int)cms.c_data[0] << " CobID=" << std::hex << cms.c_id <<
92  " Index="<< std::hex << (int)cms.c_data[2] << std::hex <<(int)cms.c_data[1]<< " Subindex=" << std::hex << (int)cms.c_data[3];
93  LOG(Log::DBG, SegSdoMessage) << " bus=" << cBus->getCanBusName() << " phase=input " << std::hex << (int)cms.c_data[0] << " CobID=" << std::hex << cms.c_id <<
94  " Index="<< std::hex << (int)cms.c_data[2] << std::hex <<(int)cms.c_data[1]<< " Subindex=" << std::hex << (int)cms.c_data[3];
95 
96  itn = NODEs.find(canopen_nodeid);
97  if (itn != NODEs.end()) {
98  (*itn).second->passSDO(&cms);
99  }
100  }
101  break;
103  LOG(Log::DBG, NGMessage) << " bus=" << cBus->getCanBusName().c_str() << " node=" << std::hex << (int)cms.c_id << " direction=read phase=came input=" << std::hex << (int)cms.c_data[0];
104 
105 // tNGMessage("NG came %s cobId=%X %hhX",cBus->getCanBusName().c_str(),cms.c_id,cms.c_data[0]);
106  itn = NODEs.find(canopen_nodeid);
107  if (itn != NODEs.end() )
108  (*itn).second->setState(&cms);
109  break;
110  default:
111 // LOG(Log::INF) << " bus=" << cBus->getCanBusName().c_str() << " node=" << std::hex << (int)cms.c_id << " direction=read phase=came input=" << std::hex << (int)cms.c_data[0];
112  rRet = false;
113  }
114  }
115 
116  void CCanUACallback::FireOnError(const int error, const char *errMsg, timeval &t)
117  {
118  LOG(Log::ERR) << " bus=" << cBus->getCanBusName() << " error=" << errMsg ;
119  cBus->setPortError(error,errMsg,t);
120  }
121 
123  PDOs.insert(pair<OpcUa_UInt32,CanPDOObject *>(pdoObject->getCobId(),pdoObject) );
124  }
125 
127  NODEs.insert(pair<OpcUa_Byte,CanNodeObject *>(cno->getCanNodeId(),cno) );
128  }
129 
131  {
132  UaStatus ret;
133  for(busNodes::iterator bpi = NODEs.begin(); bpi != NODEs.end(); bpi++) {
134  (*bpi).second->sendInitNmt();
135  }
136  }
137 
139  {
140  UaDateTime udt;
141  UaStatus ret;
142  for(busPdos::iterator bpi = PDOs.begin(); bpi != PDOs.end(); bpi++) {
143  if ((*bpi).second->getDirectionType() == CAN_IN && (*bpi).second->getCobId() > 0x180) {
144  ret = (*bpi).second->waitOperation(0);
145  }
146  }
147  }
148 
150  {
151  for(busPdos::iterator bpi = PDOs.begin(); bpi != PDOs.end(); bpi++) {
152  if ((*bpi).second->getDirectionType() == CAN_IN && (*bpi).second->getCobId() > 0x180) {
153  (*bpi).second->waitRTRData();
154  }
155  }
156  }
157 
159  {
160  UaStatus ret;
161  for(busPdos::iterator bpi = PDOs.begin(); bpi != PDOs.end(); bpi++) {
162  if ((*bpi).second->getDirectionType() == CAN_IN && (*bpi).second->getCobId() > 0x180) {
163  (*bpi).second->getInitRTRData();
164  }
165  }
166  }
167 
168 }