YARP
Yet Another Robot Platform
 
Loading...
Searching...
No Matches
RemoteControlBoardRemapper.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5
7
8#include <yarp/os/Log.h>
10#include <yarp/os/LogStream.h>
11
12#include <algorithm>
13#include <iostream>
14#include <map>
15#include <cassert>
16
17using namespace yarp::os;
18using namespace yarp::dev;
19using namespace yarp::sig;
20
21namespace {
22YARP_LOG_COMPONENT(REMOTECONTROLBOARDREMAPPER, "yarp.device.remotecontrolboardremapper")
23}
24
25
26void RemoteControlBoardRemapper::closeAllRemoteControlBoards()
27{
28 for(auto& m_remoteControlBoardDevice : m_remoteControlBoardDevices)
29 {
31 {
35 }
36 }
37
38 m_remoteControlBoardDevices.resize(0);
39}
40
41
43{
44 bool ret = true;
45
47
48 ret = ret && ok;
49
51
52 ret = ret && ok;
53
54 closeAllRemoteControlBoards();
55
56 return ret;
57}
58
60{
61 Property prop;
62 prop.fromString(config.toString());
63
64 std::string localPortPrefix;
65 std::vector<std::string> remoteControlBoardsPorts;
66
67 // Check if the required parameters are found
68 if( prop.check("localPortPrefix") && prop.find("localPortPrefix").isString() )
69 {
70 localPortPrefix = prop.find("localPortPrefix").asString();
71 }
72 else
73 {
74 yCError(REMOTECONTROLBOARDREMAPPER) << "Parsing parameters: \"localPortPrefix\" should be a string.";
75 return false;
76 }
77
78 Bottle *remoteControlBoards=prop.find("remoteControlBoards").asList();
79 if(remoteControlBoards==nullptr)
80 {
81 yCError(REMOTECONTROLBOARDREMAPPER) << "Parsing parameters: \"remoteControlBoards\" should be followed by a list.";
82 return false;
83 }
84
86 for(size_t ax=0; ax < remoteControlBoards->size(); ax++)
87 {
89 }
90
91 // Load the REMOTE_CONTROLBOARD_OPTIONS, containing any additional option to pass to the remote control boards
93
94 Bottle & optionsGroupBot = prop.findGroup("REMOTE_CONTROLBOARD_OPTIONS");
95 if( !(optionsGroupBot.isNull()) )
96 {
97 remoteControlBoardsOptions.fromString(optionsGroupBot.toString());
98 }
99
100 // Parameters loaded, open all the remote controlboards
101
102 m_remoteControlBoardDevices.resize(remoteControlBoardsPorts.size(),nullptr);
103
105
106 for(size_t ctrlBrd=0; ctrlBrd < remoteControlBoardsPorts.size(); ctrlBrd++ )
107 {
108 std::string remote = remoteControlBoardsPorts[ctrlBrd];
109 // Note: as local parameter we use localPortPrefix+remoteOfTheReportControlBoard
110 std::string local = localPortPrefix+remote;
111
113 options.put("device", "remote_controlboard");
114 options.put("local", local);
115 options.put("remote", remote);
116
117 m_remoteControlBoardDevices[ctrlBrd] = new PolyDriver();
118
119 bool ok = m_remoteControlBoardDevices[ctrlBrd]->open(options);
120
121 if( !ok || !(m_remoteControlBoardDevices[ctrlBrd]->isValid()) )
122 {
123 yCError(REMOTECONTROLBOARDREMAPPER) << "Opening remote_controlboard with remote \"" << remote << "\", opening the device failed.";
124 closeAllRemoteControlBoards();
125 return false;
126 }
127
128 // We use the remote name of the remote_controlboard as the key for it, in absence of anything better
129 remoteControlBoardsList.push((m_remoteControlBoardDevices[ctrlBrd]),remote.c_str());
130 }
131
132 // Device opened, now we open the ControlBoardRemapper and then we call attachAll
133 bool ok = ControlBoardRemapper::open(prop);
134
135 if( !ok )
136 {
137 yCError(REMOTECONTROLBOARDREMAPPER) << "Opening the controlboardremapper device, opening the device failed.";
139 closeAllRemoteControlBoards();
140 return false;
141 }
142
143 // If open went ok, we now call attachAll
145
146 if( !ok )
147 {
148 yCError(REMOTECONTROLBOARDREMAPPER) << "Calling attachAll in the controlboardremapper device, opening the device failed.";
150 closeAllRemoteControlBoards();
151 return false;
152 }
153
154 // All went ok, return true
155 // TODO: close devices that are not actually used by the remapper
156 return true;
157}
bool ret
bool close() override
Close the device driver by deallocating all resources and closing ports.
bool open(yarp::os::Searchable &prop) override
Open the device driver.
bool detachAll() override
Detach the object (you must have first called attach).
bool attachAll(const yarp::dev::PolyDriverList &l) override
Attach to a list of objects.
bool open(yarp::os::Searchable &prop) override
Open the device driver.
bool close() override
Close the device driver by deallocating all resources and closing ports.
A container for a device driver.
Definition PolyDriver.h:23
A simple collection of objects that can be described and transmitted in a portable way.
Definition Bottle.h:64
A mini-server for performing network communication in the background.
void close() override
Stop port activity.
A class for storing options and configuration information.
Definition Property.h:33
Value & find(const std::string &key) const override
Gets a value corresponding to a given keyword.
void fromString(const std::string &txt, bool wipe=true)
Interprets a string as a list of properties.
void put(const std::string &key, const std::string &value)
Associate the given key with the given string.
Definition Property.cpp:987
bool check(const std::string &key) const override
Check if there exists a property of the given name.
Bottle & findGroup(const std::string &key) const override
Gets a list corresponding to a given keyword.
A base class for nested structures that can be searched.
Definition Searchable.h:31
virtual std::string toString() const =0
Return a standard text representation of the content of the object.
virtual bool isString() const
Checks if value is a string.
Definition Value.cpp:156
virtual Bottle * asList() const
Get list value.
Definition Value.cpp:240
virtual std::string asString() const
Get string value.
Definition Value.cpp:234
#define yCError(component,...)
#define YARP_LOG_COMPONENT(name,...)
For streams capable of holding different kinds of content, check what they actually have.
An interface to the operating system, including Port based communication.