95 unsigned int numOfSets;
99 unsigned int numofcfg;
109 numofcfg =
_skCfg.totalCardsNum;
111 bool ret =
_cfgReader.readSpecialBoardCfg(config, boardCfgList, &numofcfg);
117 for(j=0; j<numofcfg; j++)
120 for(
p=0;
p<
_skCfg.patchInfoList.size();
p++)
122 if(
_skCfg.patchInfoList[
p].idPatch == boardCfgList[j].
patch)
125 if(
p>=
_skCfg.patchInfoList.size())
127 yError() <<
"EmbObjSkin::initWithSpecialConfig(): in skin of BOARD" <<
res->getProperties().boardnameString <<
"IP" <<
res->getProperties().ipv4addrString <<
": patch " << boardCfgList[j].
patch <<
"not exists";
132 eOcanport_t canport =
_skCfg.patchInfoList[
p].canport;
136 for(
int a=boardCfgList[j].boardAddrStart; a<=boardCfgList[j].
boardAddrEnd; a++)
138 boardIdx =
_skCfg.patchInfoList[
p].checkCardAddrIsInList(a);
141 yError() <<
"EmbObjSkin::initWithSpecialConfig(): in skin of BOARD" <<
res->getProperties().boardnameString <<
"IP" <<
res->getProperties().ipv4addrString <<
" card with address " << a <<
"is not present in patch " <<
_skCfg.patchInfoList[
p].idPatch;
147 eOsk_cmd_boardsCfg_t bcfg;
149 bcfg.candestination[0] = bcfg.candestination[1] = 0;
150 for(
int adr=boardCfgList[j].boardAddrStart; adr<=boardCfgList[j].
boardAddrEnd; adr++)
154 eo_common_hlfword_bitset(&bcfg.candestination[canport], adr);
159 bcfg.cfg.period = boardCfgList[j].
cfg.
period;
160 bcfg.cfg.noload = boardCfgList[j].
cfg.
noLoad;
164 for (
size_t sensorId = 0; sensorId < 16; sensorId++)
166 size_t index = 16 * 12 * boardIdx + sensorId * 12;
169 for(
int k = 0; k < 12; k++)
174 yError() <<
"readNewSpecialConfiguration: index too big";
183 protoid = eoprot_ID_get(eoprot_endpoint_skin, eoprot_entity_sk_skin,
_skCfg.patchInfoList[
p].indexNv, eoprot_tag_sk_skin_cmmnds_boardscfg);
185 if(
false ==
res->setRemoteValue(protoid, &bcfg))
187 yError() <<
"EmbObjSkin::initWithSpecialConfig(): in skin BOARD" <<
res->getProperties().boardnameString <<
"IP" <<
res->getProperties().ipv4addrString <<
" Error in send special board config for mtb with addr from"<< boardCfgList[j].
boardAddrStart <<
" to addr " << boardCfgList[j].
boardAddrEnd;
193 SystemClock::delaySystem(0.010);
200 ret =
_cfgReader.readSpecialTriangleCfg(config, triangleCfg, &numofcfg);
205 for(j=0; j<numofcfg; j++)
207 for(
p=0;
p<
_skCfg.patchInfoList.size();
p++)
209 if(
_skCfg.patchInfoList[
p].idPatch == triangleCfg[j].
patch)
212 if(
p >=
_skCfg.patchInfoList.size())
214 yError() <<
"EmbObjSkin::initWithSpecialConfig(): in skin of bBOARD" <<
res->getProperties().boardnameString <<
"IP" <<
res->getProperties().ipv4addrString <<
": patch " << triangleCfg[j].
patch <<
"not exists";
219 eOcanport_t canport =
_skCfg.patchInfoList[
p].canport;
222 if(-1 ==
_skCfg.patchInfoList[
p].checkCardAddrIsInList(triangleCfg[j].
boardAddr))
224 yError() <<
"EmbObjSkin::initWithSpecialConfig(): in skin of BOARD" <<
res->getProperties().boardnameString <<
"IP" <<
res->getProperties().ipv4addrString <<
" card with address " << triangleCfg[j].
boardAddr <<
"is not present in patch " <<
_skCfg.patchInfoList[
p].idPatch;
229 protoid = eoprot_ID_get(eoprot_endpoint_skin, eoprot_entity_sk_skin,
_skCfg.patchInfoList[
p].indexNv, eoprot_tag_sk_skin_cmmnds_trianglescfg);
232 eOsk_cmd_trianglesCfg_t tcfg = {0};
235 tcfg.candestination[0] = tcfg.candestination[1] = 0;
239 eo_common_hlfword_bitset(&tcfg.candestination[canport], adr);
246 tcfg.cfg.shift = triangleCfg[j].
cfg.
shift;
257 SystemClock::delaySystem(0.010);
259 if(
false ==
res->setRemoteValue(protoid, &tcfg))
261 yError() <<
"EmbObjSkin::initWithSpecialConfig(): in skin BOARD" <<
res->getProperties().boardnameString <<
"IP" <<
res->getProperties().ipv4addrString <<
" Error in send special triangle config for board CAN" << canport+1 <<
":" << triangleCfg[j].
boardAddr;
266 SystemClock::delaySystem(0.010);
274 Bottle bPatches, bPatchList, xtmp;
280 parser->parseService(config, skinconfig);
282 bPatches = config.findGroup(
"patches",
"skin patches connected to this device");
283 if(bPatches.isNull())
285 yError() <<
"EmbObjSkin::fromConfig(): in skin BOARD" <<
res->getProperties().boardnameString <<
"IP" <<
res->getProperties().ipv4addrString <<
"patches group is missing";
291 for (
int i=1; i<=2; i++)
293 sprintf(tmp,
"skinCanAddrsPatch%d",i);
294 if (bPatches.check(tmp))
297 bPatchList.addInt32(i);
301 _skCfg.patchInfoList.clear();
303 for(
int j=1; j<
_skCfg.numOfPatches+1; j++)
305 int id = bPatchList.get(j-1).asInt32();
306 if((
id!=1) && (
id!=2))
308 yError() <<
"EmbObjSkin::fromConfig(): in skin BOARD" <<
res->getProperties().boardnameString <<
"IP" <<
res->getProperties().ipv4addrString <<
"expecting at most 2 patches";
311 _skCfg.patchInfoList[j-1].idPatch = id;
313 _skCfg.patchInfoList[j-1].canport = (1 == id) ? eOcanport1 : eOcanport2;
318 for(
int i=0; i<
_skCfg.numOfPatches; i++)
321 int id =
_skCfg.patchInfoList[i].idPatch;
322 snprintf(tmp,
sizeof(tmp),
"skinCanAddrsPatch%d",
id);
324 xtmp = bPatches.findGroup(tmp);
327 yError() <<
"EmbObjSkin::fromConfig(): skin BOARD" <<
res->getProperties().boardnameString <<
"IP" <<
res->getProperties().ipv4addrString <<
"doesn't find " << tmp <<
"in xml file";
331 _skCfg.patchInfoList[i].cardAddrList.resize(xtmp.size()-1);
333 for(
int j=1; j<xtmp.size(); j++)
335 int addr = xtmp.get(j).asInt32();
337 _skCfg.patchInfoList[i].cardAddrList[j-1] = addr;
349 for (
int i=0; i < ttt; i++)
358 ethservice.configuration.type = eomn_serv_SK_skin;
361 ethservice.configuration.data.sk.skin.boardinfo.type = skinconfig.
canboard.
type;
363 ethservice.configuration.data.sk.skin.boardinfo.protocol.major = skinconfig.
canboard.
protocol.major;
364 ethservice.configuration.data.sk.skin.boardinfo.protocol.minor = skinconfig.
canboard.
protocol.minor;
366 ethservice.configuration.data.sk.skin.boardinfo.firmware.major = skinconfig.
canboard.
firmware.major;
367 ethservice.configuration.data.sk.skin.boardinfo.firmware.minor = skinconfig.
canboard.
firmware.minor;
368 ethservice.configuration.data.sk.skin.boardinfo.firmware.build = skinconfig.
canboard.
firmware.build;
371 ethservice.configuration.data.sk.skin.numofpatches =
_skCfg.numOfPatches;
372 if(ethservice.configuration.data.sk.skin.numofpatches > eomn_serv_skin_maxpatches)
374 yError() <<
"cannot have so many skin patches. detected" << ethservice.configuration.data.sk.skin.numofpatches <<
"max is" << eomn_serv_skin_maxpatches;
378 for(
int np=0; np<ethservice.configuration.data.sk.skin.numofpatches; np++)
381 ethservice.configuration.data.sk.skin.canmapskin[np][0] = 0;
385 ethservice.configuration.data.sk.skin.canmapskin[np][1] = 0;
387 eOcanport_t canport =
_skCfg.patchInfoList[np].canport;
389 int max =
_skCfg.patchInfoList[np].cardAddrList.size();
390 for(
int n=0;
n<max;
n++)
392 int adr =
_skCfg.patchInfoList[np].cardAddrList.at(
n);
396 eo_common_hlfword_bitset(ðservice.configuration.data.sk.skin.canmapskin[np][canport], adr);
403 if(
_cfgReader.isDefaultBoardCfgPresent(config) &&
_cfgReader.isDefaultTriangleCfgPresent(config))
419 for (
int board_idx = 0; board_idx <
_skCfg.totalCardsNum; board_idx++)
421 for (
int triangleId = 0; triangleId < 16; triangleId++)
423 int index = 16*12*board_idx + triangleId*12;
426 for (
size_t k = 0; k < 12; k++)
431 yError() <<
"readNewConfiguration: index too big";
453 yFatal() <<
"EmbObjSkin::open() fails to instantiate ethManager";
459 yError() <<
"embObjSkin::open(): object TheEthManager fails in parsing ETH propertiex from xml file";
476 yError() <<
"embObjSkin::init() fails in function fromConfig() for BOARD" <<
res->getProperties().boardnameString <<
"IP" <<
res->getProperties().ipv4addrString <<
": CANNOT PROCEED ANY FURTHER";
488 yError() <<
"embObjSkin::open() fails because could not instantiate the ethResource for BOARD w/ IP = " <<
boardIPstring <<
" ... unable to continue";
494 snprintf(name,
sizeof(name),
"embObjSkin on BOARD %s IP %s",
res->getProperties().boardnameString.c_str(),
res->getProperties().ipv4addrString.c_str());
498 if(!
res->verifyEPprotocol(eoprot_endpoint_skin))
505 const eOmn_serv_parameter_t* servparam = ðservice;
507 if(
false ==
res->serviceVerifyActivate(eomn_serv_category_skin, servparam, 5.0))
509 yError() <<
"embObjSkin::open() has an error in call of ethResources::serviceVerifyActivate() for board" <<
res->getProperties().boardnameString <<
"IP" <<
res->getProperties().ipv4addrString;
520 SystemClock::delaySystem(0.500);
542 if(
false ==
res->serviceStart(eomn_serv_category_skin))
544 yError() <<
"embObjSkin::open() fails to start skin service for BOARD" <<
res->getProperties().boardnameString <<
"IP" <<
res->getProperties().ipv4addrString <<
": cannot continue";
552 yDebug() <<
"embObjSkin::open() correctly starts skin service of BOARD" <<
res->getProperties().boardnameString <<
"IP" <<
res->getProperties().ipv4addrString;
619 eOprotID32_t protoid;
626 dat = eosk_sigmode_signal;
630 dat = eosk_sigmode_signal_oldway;
633 for(i=0; i<
_skCfg.numOfPatches;i++)
635 protoid = eoprot_ID_get(eoprot_endpoint_skin, eoprot_entity_sk_skin,
_skCfg.patchInfoList[i].indexNv, eoprot_tag_sk_skin_config_sigmode);
636 ret =
res->setRemoteValue(protoid, &dat);
639 yError() <<
"EmbObjSkin::start(): unable to start skin for BOARD" <<
res->getProperties().boardnameString <<
"IP" <<
res->getProperties().ipv4addrString <<
" on port " <<
_skCfg.patchInfoList[i].idPatch;
650 vector<eOprotID32_t> id32v(0);
651 eOprotID32_t protoid = eo_prot_ID32dummy;
656 for(
int i=0; i<
_skCfg.numOfPatches; i++)
658 protoid = eoprot_ID_get(eoprot_endpoint_skin, eoprot_entity_sk_skin,
_skCfg.patchInfoList[i].indexNv, eoprot_tag_sk_skin_status_arrayofcandata);
659 id32v.push_back(protoid);
663 if(
false ==
res->serviceSetRegulars(eomn_serv_category_skin, id32v))
665 yError() <<
"EmbObjSkin::configPeriodicMessage() fails to add its variables to regulars: cannot proceed any further";
672 yDebug() <<
"embObjSkin::configPeriodicMessage() added" << id32v.size() <<
"regular rops to BOARD" <<
res->getProperties().boardnameString <<
"with IP" <<
res->getProperties().ipv4addrString;
674 for (
size_t r = 0; r<id32v.size(); r++)
676 uint32_t id32 = id32v.at(r);
677 eoprot_ID2information(id32, nvinfo,
sizeof(nvinfo));
678 yDebug() <<
"\t it added regular rop for" << nvinfo;
682 SystemClock::delaySystem(0.005);
690 eOprotID32_t protoid;
699 eOsk_cmd_boardsCfg_t defBoardCfg = {0};
700 eOsk_cmd_trianglesCfg_t defTriangleCfg = {0};
703 defBoardCfg.cfg.skintype =
_brdCfg.skinType;
704 defBoardCfg.cfg.period =
_brdCfg.period;
705 defBoardCfg.cfg.noload =
_brdCfg.noLoad;
707 defTriangleCfg.idstart = 0;
708 defTriangleCfg.idend = 15;
709 defTriangleCfg.cfg.enable =
_triangCfg.enabled;
711 defTriangleCfg.cfg.CDCoffset =
_triangCfg.cdcOffset;
713 for(i=0; i<
_skCfg.numOfPatches;i++)
715 protoid = eoprot_ID_get(eoprot_endpoint_skin, eoprot_entity_sk_skin,
_skCfg.patchInfoList[i].indexNv, eoprot_tag_sk_skin_cmmnds_boardscfg);
718 uint8_t minAddr = 16;
721 for(k=0; k<
_skCfg.patchInfoList[i].cardAddrList.size(); k++)
723 int adr =
_skCfg.patchInfoList[i].cardAddrList[k];
727 if(
_skCfg.patchInfoList[i].cardAddrList[k] < minAddr)
728 minAddr =
_skCfg.patchInfoList[i].cardAddrList[k];
730 if(
_skCfg.patchInfoList[i].cardAddrList[k] > maxAddr)
731 maxAddr =
_skCfg.patchInfoList[i].cardAddrList[k];
738 defBoardCfg.candestination[0] = defBoardCfg.candestination[1] = 0xffff;
740 if(
false ==
res->setRemoteValue(protoid, &defBoardCfg))
742 yError() <<
"EmbObjSkin::init(): in skin BOARD" <<
res->getProperties().boardnameString <<
"IP" <<
res->getProperties().ipv4addrString <<
" Error in send default board config for patch #"<< i;
747 SystemClock::delaySystem(0.010);
749 for(i=0; i<
_skCfg.numOfPatches;i++)
751 protoid = eoprot_ID_get(eoprot_endpoint_skin, eoprot_entity_sk_skin,
_skCfg.patchInfoList[i].indexNv, eoprot_tag_sk_skin_cmmnds_trianglescfg);
755 defTriangleCfg.candestination[0] = defTriangleCfg.candestination[1] = 0xffff;
757 if(
false ==
res->setRemoteValue(protoid, &defTriangleCfg))
759 yError() <<
"EmbObjSkin::init(): in skin BOARD" <<
res->getProperties().boardnameString <<
"IP" <<
res->getProperties().ipv4addrString <<
" Error in send default triangle config for patch # "<< i;
789 uint8_t i, triangle = 0;
790 static int error = 0;
792 EOarray* arrayof = (EOarray*)rxdata;
793 uint8_t sizeofarray = eo_array_Size(arrayof);
795 eOprotIndex_t indexpatch = eoprot_ID2index(id32);
799 if(
_skCfg.patchInfoList[
p].indexNv == indexpatch)
804 yError() <<
"EmbObjSkin::update(): skin of BOARD" <<
res->getProperties().boardnameString <<
"IP" <<
res->getProperties().ipv4addrString <<
": received data of patch with nvindex= " << indexpatch;
810 errors.resize(sizeofarray);
812 for(i=0; i<sizeofarray; i++)
814 eOsk_candata_t *candata = (eOsk_candata_t*) eo_array_At(arrayof, i);
821 uint16_t canframeid11 = EOSK_CANDATA_INFO2IDCAN(candata->info);
822 uint8_t canframesize = EOSK_CANDATA_INFO2SIZE(candata->info);
823 uint8_t *canframedata = candata->data;
826 uint8_t cardAddr = 0;
831 skinClass = ICUBCANPROTO_CLASS_PERIODIC_SKIN;
833 skinClass = ICUBCANPROTO_CLASS_PERIODIC_ANALOGSENSOR;
837 valid = (((canframeid11 & 0x0f00) >> 8) == skinClass) ? 1 : 0;
841 cardAddr = (canframeid11 & 0x00f0) >> 4;
843 for (
size_t cId_index = 0; cId_index<
_skCfg.patchInfoList[
p].cardAddrList.size(); cId_index++)
845 if(
_skCfg.patchInfoList[
p].cardAddrList[cId_index] == cardAddr)
848 if(
_skCfg.numOfPatches==2 &&
p==0)
849 mtbId +=
_skCfg.patchInfoList[1].cardAddrList.size();
861 triangle = (canframeid11 & 0x000f);
862 msgtype = (int) canframedata[0];
864 int index=16*12*mtbId + triangle*12;
871#if defined(DEBUG_PRINT_RX_STATS)
872 receivedpatches[
p][cardAddr]++;
876 for(
int k = 0; k < 7; k++)
878 skindata[index + k] = canframedata[k + 1];
881 else if (msgtype == 0xC0)
884 for(
int k = 0; k < 5; k++)
886 skindata[index + k + 7] = canframedata[k + 1];
892 if (canframesize == 8)
895 _isDiagnosticPresent =
true;
898 short head = canframedata[6];
899 short tail = canframedata[7];
900 int fullMsg = (head << 8) | (tail & 0xFF);
903 errors[i].net = indexpatch;
904 errors[i].board = cardAddr;
905 errors[i].sensor = triangle;
906 errors[i].error = fullMsg;
910 yError() <<
"embObjSkin error code: " <<
911 "BOARD: " <<
res->getProperties().boardnameString <<
912 "IP:" <<
res->getProperties().ipv4addrString <<
913 "canDeviceNum: " << errors[i].net <<
914 "board: " << errors[i].board <<
915 "sensor: " << errors[i].sensor <<
921 _isDiagnosticPresent =
false;
927 else if(canframeid11 == 0x100)
935 yError() <<
"EMS: " <<
res->getProperties().ipv4addrString <<
" Unknown Message received from skin (" << i<<
"/"<< sizeofarray <<
"): frameID=" << canframeid11<<
" len="<<canframesize <<
"canframe.data="<<canframedata[0] <<
" " <<canframedata[1] <<
" " <<canframedata[2] <<
" " <<canframedata[3] <<
"\n" ;
942#if defined(DEBUG_PRINT_RX_STATS)
943 if(counterpa >= 10000)
946 yDebug(
"pa = {{%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d} {%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d}}",
947 receivedpatches[0][0], receivedpatches[0][1], receivedpatches[0][2], receivedpatches[0][3], receivedpatches[0][4], receivedpatches[0][5], receivedpatches[0][6], receivedpatches[0][7],
948 receivedpatches[0][8], receivedpatches[0][9], receivedpatches[0][10], receivedpatches[0][11], receivedpatches[0][12], receivedpatches[0][13], receivedpatches[0][14], receivedpatches[0][15],
949 receivedpatches[1][0], receivedpatches[1][1], receivedpatches[1][2], receivedpatches[1][3], receivedpatches[1][4], receivedpatches[1][5], receivedpatches[1][6], receivedpatches[1][7],
950 receivedpatches[1][8], receivedpatches[1][9], receivedpatches[1][10], receivedpatches[1][11], receivedpatches[1][12], receivedpatches[1][13], receivedpatches[1][14], receivedpatches[1][15]