12 #include <yarp/os/Log.h>
13 #include <yarp/os/LogStream.h>
19 #include "EoAnalogSensors.h"
20 #include "EoProtocol.h"
21 #include "EoProtocolAS.h"
22 #include "EoProtocolMN.h"
25 #pragma warning(once : 4355)
29 using namespace yarp::os;
32 embObjMultipleFTsensors::embObjMultipleFTsensors()
34 yInfo() <<
"MultipleFTSensors has been created";
35 device_ = std::make_shared<yarp::dev::embObjDevPrivData>(
"embObjMultipleFTsensors");
38 embObjMultipleFTsensors::embObjMultipleFTsensors(std::shared_ptr<yarp::dev::embObjDevPrivData> device) : device_(device)
54 yInfo() <<
"embObjMultipleFTsensors::open(): preparing ETH resource";
55 if (!
device_->prerareEthService(config,
this))
58 yInfo() <<
device_->getBoardInfo() <<
" embObjMultipleFTsensors::open(): browsing xml files which describe the service";
60 if (!parser.
parse(config))
62 yError() <<
device_->getBoardInfo() <<
"open() fails to parse xml... cannot continue ";
66 yInfo() <<
device_->getBoardInfo() <<
" embObjMultipleFTsensors::open(): verify the presence of the board and if its protocol version is correct";
67 if (!
device_->res->verifyEPprotocol(eoprot_endpoint_analogsensors))
69 yError() <<
device_->getBoardInfo() <<
" open() fails to verifyEPprotocol... cannot continue ";
74 yInfo() <<
device_->getBoardInfo() <<
" embObjMultipleFTsensors::open(): verify and activate the FT service";
75 eOmn_serv_parameter_t ftData;
76 ftData.configuration.type = eomn_serv_AS_ft;
77 ftData.configuration.diagnosticsmode = eomn_serv_diagn_mode_NONE;
78 ftData.configuration.diagnosticsparam = 0;
79 parser.
toEomn(ftData.configuration.data.as.ft);
80 if (!
device_->res->serviceVerifyActivate(eomn_serv_category_ft, &ftData, 5.0))
82 yError() <<
device_->getBoardInfo() <<
" open() fails to serviceVerifyActivate... cannot continue ";
87 yInfo() <<
device_->getBoardInfo() <<
" embObjMultipleFTsensors::open(): configure the FT service";
90 yError() <<
device_->getBoardInfo() <<
" open() fails to sendConfig2boards... cannot continue";
95 yInfo() <<
device_->getBoardInfo() <<
" embObjMultipleFTsensors::open(): impose the network variable which the ETH bord must stream up";
98 yError() <<
device_->getBoardInfo() <<
" open() fails to initRegulars... cannot continue";
103 yInfo() <<
device_->getBoardInfo() <<
" embObjMultipleFTsensors::open(): start the FT service";
104 if (!
device_->res->serviceStart(eomn_serv_category_ft))
106 yError() <<
device_->getBoardInfo() <<
" open() fails to serviceStart... cannot continue";
114 yDebug() <<
device_->getBoardInfo() <<
" open() correctly starts service";
118 yInfo() <<
device_->getBoardInfo() <<
" embObjMultipleFTsensors::open(): start streaming of FT data";
121 yError() <<
device_->getBoardInfo() <<
" open() fails to sendStart2boards... cannot continue";
134 for (
const auto &[
id,
data] : ftInfos)
136 eOprotID32_t id32 = eo_prot_ID32dummy;
137 eOas_ft_config_t cfg;
138 cfg.ftperiod =
data.ftAcquisitionRate;
139 cfg.temperatureperiod =
data.temperatureAcquisitionRate / 1000;
140 cfg.mode =
data.useCalibration;
141 cfg.calibrationset = 0;
142 id32 = eoprot_ID_get(eoprot_endpoint_analogsensors, eoprot_entity_as_ft, index, eoprot_tag_as_ft_config);
146 yError() <<
device_->getBoardInfo() <<
" sendConfig2boards() while try to configure ftPeriod=" << cfg.ftperiod;
152 yDebug() <<
device_->getBoardInfo() <<
" sendConfig2boards() correctly configured boards with ftPeriod=" << cfg.ftperiod;
156 eOprotIndex_t eoprotIndex = eoprot_ID2index(id32);
157 std::unique_lock<std::shared_mutex> lck(
mutex_);
165 eOprotID32_t id32 = eo_prot_ID32dummy;
169 const auto &ftInfos = parser.
getFtInfo();
171 for (
const auto &[
id,
data] : ftInfos)
173 id32 = eoprot_ID_get(eoprot_endpoint_analogsensors, eoprot_entity_as_ft, index, eoprot_tag_as_ft_cmmnds_enable);
177 yError() <<
device_->getBoardInfo() <<
" sendStart2boards() while try to enable the boards transmission";
183 yDebug() <<
device_->getBoardInfo() <<
" sendStart2boards() correctly enabled the boards transmission";
194 vector<eOprotID32_t> id32v;
195 eOprotID32_t id32 = eo_prot_ID32dummy;
197 const auto &ftInfos = parser.
getFtInfo();
199 for (
const auto &[
id,
data] : ftInfos)
201 id32 = eoprot_ID_get(eoprot_endpoint_analogsensors, eoprot_entity_as_ft, index, eoprot_tag_as_ft_status_timedvalue);
202 id32v.push_back(id32);
208 yError() <<
device_->getBoardInfo() <<
" initRegulars() fails to add its variables to regulars: cannot proceed any further";
214 yDebug() <<
device_->getBoardInfo() <<
" initRegulars() added" << id32v.size() <<
"regular rops ";
216 for (
size_t r = 0; r < id32v.size(); r++)
218 uint32_t item = id32v.at(r);
219 eoprot_ID2information(item, nvinfo,
sizeof(nvinfo));
220 yDebug() <<
device_->getBoardInfo() <<
"\t it added regular rop for" << nvinfo;
237 eOprotIndex_t eoprotIndex = eoprot_ID2index(id32);
240 yError() <<
device_->getBoardInfo() <<
" update() index too big";
244 eOprotEntity_t entity = eoprot_ID2entity(id32);
245 if (entity != eoprot_entity_as_ft)
247 yError() <<
device_->getBoardInfo() <<
" update() wrong entity";
251 eOprotTag_t tag = eoprot_ID2tag(id32);
252 if (tag != eoprot_tag_as_ft_status_timedvalue)
254 yError() <<
device_->getBoardInfo() <<
" update() wrong tag";
258 eOas_ft_timedvalue_t *
data = (eOas_ft_timedvalue_t *)rxdata;
264 std::unique_lock<std::shared_mutex> lck(
mutex_);
266 for (
int index = 0; index < eoas_ft_6axis; ++index)
294 std::shared_lock<std::shared_mutex> lck(
mutex_);
298 yError() <<
device_->getBoardInfo() <<
" getSixAxisForceTorqueSensorMeasure() fails data for index:" << sensorIndex <<
" not found";
325 std::shared_lock<std::shared_mutex> lck(
mutex_);
332 std::shared_lock<std::shared_mutex> lck(
mutex_);
349 std::shared_lock<std::shared_mutex> lck(
mutex_);
356 std::shared_lock<std::shared_mutex> lck(
mutex_);
366 std::shared_lock<std::shared_mutex> lck(
mutex_);
370 yError() <<
device_->getBoardInfo() <<
" getTemperatureSensorMeasure() fails data for index:" << sensorIndex <<
" not found";
398 yError() <<
device_->getBoardInfo() <<
" update timeout for index:" << eoprot_ID2index(id32);
400 masStatus_[eoprot_ID2index(id32)] = MAS_TIMEOUT;
411 return yarp::os::Time::now();
bool parse(const yarp::os::Searchable &config)
std::map< std::string, FtInfo > & getFtInfo()
bool toEomn(eOmn_serv_config_data_as_ft_t &out) const
virtual bool setcheckRemoteValue(const eOprotID32_t id32, void *value, const unsigned int retries=10, const double waitbeforecheck=0.001, const double timeout=0.050)=0
virtual bool serviceSetRegulars(eOmn_serv_category_t category, vector< eOprotID32_t > &id32vector, double timeout=0.500)=0
std::vector< yarp::dev::MAS_status > masStatus_
virtual bool initialised()
virtual bool getTemperatureSensorFrameName(size_t sensorindex, std::string &frameName) const override
bool checkUpdateTimeout(eOprotID32_t id32, eOabstime_t current)
virtual yarp::dev::MAS_status getSixAxisForceTorqueSensorStatus(size_t sensorindex) const override
bool initRegulars(ServiceParserMultipleFt &parser, eth::AbstractEthResource *deviceRes)
bool open(yarp::os::Searchable &config)
static constexpr bool useBoardTimeFlag_
std::map< eOprotID32_t, FtData > ftSensorsData_
bool sendStart2boards(ServiceParserMultipleFt &parser, eth::AbstractEthResource *deviceRes)
virtual eth::iethresType_t type()
virtual bool getTemperatureSensorMeasure(size_t sensorindex, double &out, double ×tamp) const override
virtual size_t getNrOfTemperatureSensors() const override
double calculateBoardTime(eOabstime_t current)
virtual bool getSixAxisForceTorqueSensorFrameName(size_t sensorindex, std::string &frameName) const override
static constexpr bool checkUpdateTimeoutFlag_
virtual bool update(eOprotID32_t id32, double timestamp, void *rxdata)
std::map< eOprotID32_t, TemperatureData > temperaturesensordata_
double firstYarpTimestamp_
virtual size_t getNrOfSixAxisForceTorqueSensors() const override
static constexpr eOabstime_t updateTimeout_
bool sendConfig2boards(ServiceParserMultipleFt &parser, eth::AbstractEthResource *deviceRes)
virtual bool getSixAxisForceTorqueSensorMeasure(size_t sensorindex, yarp::sig::Vector &out, double ×tamp) const override
std::shared_ptr< yarp::dev::embObjDevPrivData > device_
eOabstime_t firstCanTimestamp_
std::map< eOprotID32_t, eOabstime_t > timeoutUpdate_
virtual bool getSixAxisForceTorqueSensorName(size_t sensorindex, std::string &name) const override
~embObjMultipleFTsensors()
virtual yarp::dev::MAS_status getTemperatureSensorStatus(size_t sensorindex) const override
virtual bool getTemperatureSensorName(size_t sensorindex, std::string &name) const override
static constexpr int ftChannels_
Copyright (C) 2008 RobotCub Consortium.