2
2
3
3
#include " CanBusBroker.hpp"
4
4
5
- #include < algorithm> // std::any_of, std::find_if, std::for_each
5
+ #include < algorithm> // std::any_of, std::find_if
6
6
#include < iterator> // std::distance
7
7
8
8
#include < yarp/os/Bottle.h>
@@ -98,33 +98,23 @@ const yarp::dev::PolyDriverDescriptor * CanBusBroker::tryCreateFakeNode(const ya
98
98
99
99
bool CanBusBroker::attachAll (const yarp::dev::PolyDriverList & drivers)
100
100
{
101
- std::vector<std::string> nodeNames; // flattened broker[i]->getNodeNames()
102
-
103
- std::for_each (brokers.begin (), brokers.end (), [&nodeNames](const auto * broker)
104
- { nodeNames.insert (nodeNames.end (),
105
- broker->getNodeNames ().begin (),
106
- broker->getNodeNames ().end ()); });
107
-
108
- std::vector<const yarp::dev::PolyDriverDescriptor *> buses (brokers.size ());
101
+ const auto & nodeNames = broker->getNodeNames ();
102
+ const yarp::dev::PolyDriverDescriptor * bus = nullptr ;
109
103
std::vector<const yarp::dev::PolyDriverDescriptor *> nodes (nodeNames.size ());
110
104
111
105
for (int i = 0 ; i < drivers.size (); i++)
112
106
{
113
107
const auto * driver = drivers[i];
114
108
115
- if (auto bus = std::find_if (brokers.begin (), brokers.end (), [driver](const auto * broker)
116
- { return broker->getBusName () == driver->key ; });
117
- bus != brokers.end ())
109
+ if (driver->key == broker->getBusName ())
118
110
{
119
- int index = std::distance (brokers.begin (), bus);
120
-
121
- if (buses[index ] != nullptr )
111
+ if (bus != nullptr )
122
112
{
123
113
yCError (CBB) << " Bus device" << driver->key << " already attached" ;
124
114
return false ;
125
115
}
126
116
127
- buses[ index ] = driver;
117
+ bus = driver;
128
118
}
129
119
else if (auto node = std::find_if (nodeNames.begin (), nodeNames.end (), [driver](const auto & name)
130
120
{ return name == driver->key ; });
@@ -147,19 +137,9 @@ bool CanBusBroker::attachAll(const yarp::dev::PolyDriverList & drivers)
147
137
}
148
138
}
149
139
150
- if (std::any_of (buses. begin (), buses. end (), []( const auto * bus) { return bus == nullptr ; }) )
140
+ if (bus == nullptr )
151
141
{
152
- std::vector<std::string> names;
153
-
154
- for (int i = 0 ; i < buses.size (); i++)
155
- {
156
- if (buses[i] == nullptr )
157
- {
158
- names.push_back (brokers[i]->getBusName ());
159
- }
160
- }
161
-
162
- yCError (CBB) << " Some bus devices are missing:" << names;
142
+ yCError (CBB) << " The bus device is missing:" << broker->getBusName ();
163
143
return false ;
164
144
}
165
145
@@ -188,18 +168,15 @@ bool CanBusBroker::attachAll(const yarp::dev::PolyDriverList & drivers)
188
168
}
189
169
}
190
170
191
- yCInfo (CBB) << " Attached" << buses. size () << " bus device(s) and" << nodes.size () << " node device(s)" ;
171
+ yCInfo (CBB) << " Attached" << bus-> key << " bus device and" << nodes.size () << " node device(s): " << nodeNames ;
192
172
193
- for ( int i = 0 ; i < buses. size (); i++ )
173
+ if (!broker-> registerDevice (bus-> poly ) )
194
174
{
195
- if (!brokers[i]->registerDevice (buses[i]->poly ))
196
- {
197
- yCError (CBB) << " Unable to register bus device" << buses[i]->key ;
198
- return false ;
199
- }
175
+ yCError (CBB) << " Unable to register bus device" << bus->key ;
176
+ return false ;
200
177
}
201
178
202
- yCInfo (CBB) << " Registered bus devices " ;
179
+ yCInfo (CBB) << " Registered bus device " ;
203
180
204
181
for (int i = 0 ; i < nodes.size (); i++)
205
182
{
@@ -219,24 +196,16 @@ bool CanBusBroker::attachAll(const yarp::dev::PolyDriverList & drivers)
219
196
return false ;
220
197
}
221
198
222
- auto it = std::find_if (brokers.begin (), brokers.end (), [node](const auto * broker)
223
- { const auto & names = broker->getNodeNames ();
224
- return std::find (names.begin (), names.end (), node->key ) != names.end (); });
225
-
226
- auto * broker = *it;
227
199
broker->getReader ()->registerHandle (iCanBusSharer);
228
200
iCanBusSharer->registerSender (broker->getWriter ()->getDelegate ());
229
201
}
230
202
231
203
yCInfo (CBB) << " Registered node devices" ;
232
204
233
- for ( int i = 0 ; i < buses. size (); i++ )
205
+ if (!broker-> startThreads () )
234
206
{
235
- if (!brokers[i]->startThreads ())
236
- {
237
- yCError (CBB) << " Unable to start CAN threads in" << brokers[i]->getBusName ();
238
- return false ;
239
- }
207
+ yCError (CBB) << " Unable to start CAN threads in" << broker->getBusName ();
208
+ return false ;
240
209
}
241
210
242
211
yCInfo (CBB) << " Started CAN threads" ;
@@ -251,15 +220,31 @@ bool CanBusBroker::attachAll(const yarp::dev::PolyDriverList & drivers)
251
220
}
252
221
}
253
222
223
+ broker->markInitialized (true );
224
+
254
225
yCInfo (CBB) << " Initialized node devices" ;
255
226
256
- if (syncThread && ! syncThread-> isRunning () && !syncThread-> start ())
227
+ if (auto & syncThread = getSyncThread (); !syncThread. getBrokers (). empty ())
257
228
{
258
- yCError (CBB) << " Unable to start synchronization thread" ;
259
- return false ;
260
- }
229
+ if (!syncThread.openPort (" /sync:o" ))
230
+ {
231
+ yCError (CBB) << " Unable to open synchronization port" ;
232
+ return false ;
233
+ }
261
234
262
- yCInfo (CBB) << " Started synchronization thread" ;
235
+ if (!syncThread.isRunning ())
236
+ {
237
+ if (!syncThread.start ())
238
+ {
239
+ yCError (CBB) << " Unable to start synchronization thread" ;
240
+ return false ;
241
+ }
242
+ else
243
+ {
244
+ yCInfo (CBB) << " Started synchronization thread" ;
245
+ }
246
+ }
247
+ }
263
248
264
249
return true ;
265
250
}
@@ -270,30 +255,43 @@ bool CanBusBroker::detachAll()
270
255
{
271
256
bool ok = true ;
272
257
273
- if (syncThread && syncThread-> isRunning () )
258
+ if (broker )
274
259
{
275
- syncThread->stop ();
260
+ broker->markInitialized (false );
261
+ }
262
+
263
+ if (auto & syncThread = getSyncThread (); syncThread.isRunning ())
264
+ {
265
+ syncThread.stop ();
266
+ syncThread.closePort ();
267
+
268
+ yCInfo (CBB) << " Stopped synchronization thread" ;
276
269
}
277
270
278
271
for (const auto & rawDevice : deviceMapper.getDevices ())
279
272
{
280
273
auto * iCanBusSharer = rawDevice->castToType <ICanBusSharer>();
274
+ yCDebug (CBB) << " Finalizing node device id" << iCanBusSharer->getId ();
281
275
282
276
if (iCanBusSharer && !iCanBusSharer->finalize ())
283
277
{
284
278
yCWarning (CBB) << " Node device id" << iCanBusSharer->getId () << " could not finalize CAN comms" ;
285
279
ok = false ;
286
280
}
281
+
282
+ yCDebug (CBB) << " Unregistering node device id" << iCanBusSharer->getId ();
287
283
}
288
284
289
285
deviceMapper.clear ();
290
286
291
- for ( auto * broker : brokers )
287
+ if ( broker)
292
288
{
293
289
ok &= broker->stopThreads ();
294
290
ok &= broker->clearFilters ();
295
291
}
296
292
293
+ yCDebug (CBB) << " Stopped CAN threads" ;
294
+
297
295
for (int i = 0 ; i < fakeNodes.size (); i++)
298
296
{
299
297
if (fakeNodes[i]->poly && fakeNodes[i]->poly ->isValid ())
0 commit comments