17 #include <yarp/os/Time.h>
18 #include <yarp/os/Log.h>
19 #include <yarp/os/LogStream.h>
22 #include <yarp/dev/PolyDriver.h>
23 #include <ace/config.h>
24 #include <ace/Log_Msg.h>
30 #include <yarp/os/LogStream.h>
31 #include "EoAnalogSensors.h"
34 #include "EoProtocol.h"
35 #include "EoProtocolMN.h"
36 #include "EoProtocolAS.h"
38 #include <yarp/os/NetType.h>
39 #include <yarp/conf/environment.h>
42 #pragma warning(once:4355)
48 using namespace yarp::os;
54 yWarning() << std::string(txt) <<
" not yet implemented for embObjStrain\n";
59 bool embObjStrain::fromConfig(yarp::os::Searchable &_config)
61 if(
false == parser->parseService(_config, serviceConfig))
70 embObjStrain::embObjStrain()
72 serviceConfig.useCalibration =
false;
73 serviceConfig.acquisitionrate = 0;
74 memset(&serviceConfig.ethservice, 0,
sizeof(serviceConfig.ethservice));
82 status = IAnalogSensor::AS_OK;
88 scaleFactor.resize(0);
90 scaleFactorIsFilled =
false;
92 std::string
tmp = yarp::conf::environment::get_string(
"ETH_VERBOSEWHENOK");
95 verbosewhenok = (bool)(yarp::conf::numeric::from_string(
tmp, 0U));
99 verbosewhenok =
false;
108 embObjStrain::~embObjStrain()
110 analogdata.resize(0);
112 scaleFactor.resize(0);
122 bool embObjStrain::initialised()
128 bool embObjStrain::open(yarp::os::Searchable &config)
133 if(NULL == ethManager)
135 yFatal() <<
"embObjStrain::open() fails to instantiate ethManager";
140 if(
false == ethManager->verifyEthBoardInfo(config, ipv4addr, boardIPstring, boardName))
142 yError() <<
"embObjStrain::open(): object TheEthManager fails in parsing ETH propertiex from xml file";
158 if(!fromConfig(config))
160 yError() <<
"embObjStrain for BOARD w/ IP" << boardIPstring <<
"is missing some configuration parameter. Check logs and your config file.";
167 analogdata.resize(strain_Channels, 0.0);
168 offset.resize(strain_Channels, 0.0);
169 scaleFactor.resize(strain_Channels, 1.0);
179 res = ethManager->requestResource2(
this, config);
182 yError() <<
"embObjStrain::open() fails because could not instantiate the ethResource for BOARD w/ IP = " << boardIPstring <<
" ... unable to continue";
186 printServiceConfig();
188 if(!res->verifyEPprotocol(eoprot_endpoint_analogsensors))
195 #if defined(EMBOBJSTRAIN_USESERVICEPARSER)
196 const eOmn_serv_parameter_t* servparam = &serviceConfig.ethservice;
198 const eOmn_serv_parameter_t* servparam = NULL;
201 if(
false == res->serviceVerifyActivate(eomn_serv_category_strain, servparam, 5.0))
203 yError() <<
"embObjStrain::open() has an error in call of ethResources::serviceVerifyActivate() for BOARD" << res->getProperties().boardnameString <<
"IP" << res->getProperties().ipv4addrString;
204 printServiceConfig();
210 printServiceConfig();
213 if(
false == fillScaleFactor())
215 yError() <<
"embObjStrain::open() has failed in calling embObjStrain::fillScaleFactor()";
219 if(
false == sendConfig2Strain())
225 if(
false == initRegulars())
232 if(
false == res->serviceStart(eomn_serv_category_strain))
234 yError() <<
"embObjStrain::open() fails to start service for BOARD" << res->getProperties().boardnameString <<
"IP" << res->getProperties().ipv4addrString <<
": cannot continue";
242 yDebug() <<
"embObjStrain::open() correctly starts as service of BOARD" << res->getProperties().boardnameString <<
"IP" << res->getProperties().ipv4addrString;
251 bool embObjStrain::sendConfig2Strain(
void)
253 eOas_strain_config_t strainConfig = {0};
255 strainConfig.datarate = serviceConfig.acquisitionrate;
256 strainConfig.signaloncefullscale = eobool_false;
257 strainConfig.mode = (
true == serviceConfig.useCalibration) ? (eoas_strainmode_txcalibrateddatacontinuously) : (eoas_strainmode_txuncalibrateddatacontinuously);
261 eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_analogsensors, eoprot_entity_as_strain, 0, eoprot_tag_as_strain_config);
263 if(
false == res->setcheckRemoteValue(id32, &strainConfig, 10, 0.010, 0.050))
265 yError() <<
"FATAL: embObjStrain::sendConfig2Strain() had an error while calling setcheckRemoteValue() for strain config in BOARD" << res->getProperties().boardnameString <<
"with IP" << res->getProperties().ipv4addrString;
272 yDebug() <<
"embObjStrain::sendConfig2Strain() correctly configured strain coinfig in BOARD" << res->getProperties().boardnameString <<
"with IP" << res->getProperties().ipv4addrString;
290 bool embObjStrain::fillScaleFactor()
293 if(
true == scaleFactorIsFilled)
299 for(
size_t i = 0; i<scaleFactor.size(); i++)
301 scaleFactor[i] = 1.0f;
305 if(
false == serviceConfig.useCalibration)
309 yDebug() <<
"embObjStrain::fillScaleFactor(): we DONT use calibration, thus all scale factors are set to 1.0";
312 scaleFactorIsFilled =
true;
332 bool gotFullScaleValues =
false;
338 EOnv *p_tmpNV = NULL;
339 eOas_arrayofupto12bytes_t fullscale_values = {0};
342 eo_array_New(6, 2, &fullscale_values);
344 eOprotID32_t id32_fullscale = eoprot_ID_get(eoprot_endpoint_analogsensors, eoprot_entity_as_strain, 0, eoprot_tag_as_strain_status_fullscale);
349 const bool overrideROprotection =
true;
350 res->setLocalValue(id32_fullscale, &fullscale_values, overrideROprotection);
354 eOas_strain_config_t strainConfig = {0};
355 strainConfig.datarate = serviceConfig.acquisitionrate;
356 strainConfig.mode = eoas_strainmode_acquirebutdonttx;
357 strainConfig.signaloncefullscale = eobool_true;
359 eOprotID32_t id32_strain_config = eoprot_ID_get(eoprot_endpoint_analogsensors, eoprot_entity_as_strain, 0, eoprot_tag_as_strain_config);
364 while(!gotFullScaleValues && (timeout != 0))
366 res->setRemoteValue(id32_strain_config, &strainConfig);
367 SystemClock::delaySystem(1.0);
369 res->getLocalValue(id32_fullscale, &fullscale_values);
372 NVsize = eo_array_Size((EOarray *)&fullscale_values);
376 gotFullScaleValues =
true;
383 yWarning() <<
"embObjStrain::fillScaleFactor(): for BOARD" << res->getProperties().boardnameString <<
"IP" << res->getProperties().ipv4addrString <<
": full scale val not arrived yet... retrying in 1 sec";
387 if((
false == gotFullScaleValues) && (0 == timeout))
389 yError() <<
"embObjStrain::fillScaleFactor(): ETH Analog sensor: request for calibration parameters timed out for BOARD" << res->getProperties().boardnameString <<
"IP" << res->getProperties().ipv4addrString;
393 if((strain_Channels != NVsize))
395 yError() <<
"Analog sensor Calibration data has a different size from channels number in configuration file for BOARD" << res->getProperties().boardnameString <<
"IP" << res->getProperties().ipv4addrString <<
"Aborting";
400 if(gotFullScaleValues)
404 yWarning() <<
"embObjStrain::fillScaleFactor() detected that already has full scale values for BOARD" << res->getProperties().boardnameString <<
"IP" << res->getProperties().ipv4addrString;
405 yDebug() <<
"embObjStrain::fillScaleFactor(): Fullscale values for BOARD" << res->getProperties().boardnameString <<
"IP" << res->getProperties().ipv4addrString <<
"are: size=" << eo_array_Size((EOarray *)&fullscale_values) <<
" numchannel=" << strain_Channels;
408 for (
size_t i = 0; i<scaleFactor.size(); i++)
411 uint8_t *msg = (uint8_t *) eo_array_At((EOarray *) &fullscale_values, i);
414 yError() <<
"I don't receive data for channel " << i;
418 scaleFactor[i] = ((uint16_t)(msg[0]<<8) | msg[1]);
422 yDebug() <<
"embObjStrain::fillScaleFactor(): channel " << i <<
"full scale value " << scaleFactor[i];
426 scaleFactorIsFilled =
true;
429 return scaleFactorIsFilled;
433 bool embObjStrain::initRegulars()
437 vector<eOprotID32_t> id32v(0);
438 eOprotID32_t id32 = eo_prot_ID32dummy;
442 if(
true == serviceConfig.useCalibration)
444 id32 = eoprot_ID_get(eoprot_endpoint_analogsensors, eoprot_entity_as_strain, 0, eoprot_tag_as_strain_status_calibratedvalues);
448 id32 = eoprot_ID_get(eoprot_endpoint_analogsensors, eoprot_entity_as_strain, 0, eoprot_tag_as_strain_status_uncalibratedvalues);
454 id32v.push_back(id32);
459 if(
false == res->serviceSetRegulars(eomn_serv_category_strain, id32v))
461 yError() <<
"embObjStrain::initRegulars() fails to add its variables to regulars: cannot proceed any further";
468 yDebug() <<
"embObjStrain::initRegulars() added" << id32v.size() <<
"regular rops to BOARD" << res->getProperties().boardnameString <<
"with IP" << res->getProperties().ipv4addrString;
470 for (
size_t r = 0; r<id32v.size(); r++)
472 uint32_t item = id32v.at(r);
473 eoprot_ID2information(item, nvinfo,
sizeof(nvinfo));
474 yDebug() <<
"\t it added regular rop for" << nvinfo;
496 std::lock_guard<std::mutex> lck(mtx);
499 if (status != IAnalogSensor::AS_OK)
503 case IAnalogSensor::AS_OVF:
507 case IAnalogSensor::AS_ERROR:
511 case IAnalogSensor::AS_TIMEOUT:
523 out.resize(analogdata.size());
524 for (
size_t k = 0; k<analogdata.size(); k++)
533 void embObjStrain::resetCounters()
541 void embObjStrain::getCounters(
unsigned int &
sat,
unsigned int &err,
unsigned int &to)
549 int embObjStrain::getState(
int ch)
551 printf(
"getstate\n");
556 int embObjStrain::getChannels()
558 return strain_Channels;
562 int embObjStrain::calibrateSensor()
564 std::lock_guard<std::mutex> lck(mtx);
565 for (
size_t i = 0; i < analogdata.size(); i++)
567 offset[i] = -analogdata[i];
573 int embObjStrain::calibrateSensor(
const yarp::sig::Vector& value)
579 int embObjStrain::calibrateChannel(
int ch)
585 int embObjStrain::calibrateChannel(
int ch,
double v)
595 bool embObjStrain::update(eOprotID32_t id32,
double timestamp,
void* rxdata)
598 timestamp = timestamp;
610 EOarray *array = (EOarray*)rxdata;
611 uint8_t size = eo_array_Size(array);
612 uint8_t itemsize = eo_array_ItemSize(array);
613 if((0 == size) || (2 != itemsize))
619 std::lock_guard<std::mutex> lck(mtx);
621 for (
size_t k = 0; k<analogdata.size(); k++)
624 char*
tmp = (
char*) eo_array_At(array, k);
629 uint8_t msg[2] = {0};
632 analogdata[k] = (short)( ( (((
unsigned short)(msg[1]))<<8)+msg[0]) - (
unsigned short) (0x8000) );
634 if(
true == serviceConfig.useCalibration)
636 analogdata[k] = analogdata[k]*scaleFactor[k]/float(0x8000);
646 bool embObjStrain::close()
655 void embObjStrain::printServiceConfig(
void)
660 const char * boardname = (NULL != res) ? (res->getProperties().boardnameString.c_str()) : (
"NOT-ASSIGNED-YET");
661 const char * ipv4 = (NULL != res) ? (res->getProperties().ipv4addrString.c_str()) : (
"NOT-ASSIGNED-YET");
662 const char * boardtype = eoboards_type2string2(
static_cast<eObrd_type_t
>(serviceConfig.ethservice.configuration.data.as.strain.boardtype.type), eobool_true);
664 parser->convert(serviceConfig.ethservice.configuration.data.as.strain.canloc, loc,
sizeof(loc));
665 parser->convert(serviceConfig.ethservice.configuration.data.as.strain.boardtype.firmware, fir,
sizeof(fir));
666 parser->convert(serviceConfig.ethservice.configuration.data.as.strain.boardtype.protocol, pro,
sizeof(pro));
668 yInfo() <<
"The embObjStrain device using BOARD" << boardname <<
" w/ IP" << ipv4 <<
"has the following service config:";
669 yInfo() <<
"- acquisitionrate =" << serviceConfig.acquisitionrate;
670 yInfo() <<
"- useCalibration =" << serviceConfig.useCalibration;
671 yInfo() <<
"- STRAIN of type" << boardtype <<
"named" << serviceConfig.nameOfStrain <<
"@" << loc <<
"with required protocol version =" << pro <<
"and required firmware version =" << fir;
675 void embObjStrain::cleanup(
void)
677 if(ethManager == NULL)
return;
679 int ret = ethManager->releaseResource2(res,
this);
682 ethManager->killYourself();
static TheEthManager * instance()
bool NOT_YET_IMPLEMENTED(const char *txt)
double sat(const double val, const double min, const double max)
bool read(yarp::os::Searchable &cfgtotal, pc104Data &pc104data)
Copyright (C) 2008 RobotCub Consortium.