12#include <yarp/os/Time.h>
13#include <yarp/os/Log.h>
17#include <iCubCanProtocol.h>
21using namespace yarp::os;
28 yarp::os::Time::delay(
time/1000);
43 if (hexStg[
n] > 0x29 && hexStg[
n] < 0x40 )
44 digit[
n] = hexStg[
n] & 0x0f;
45 else if (hexStg[
n] >=
'a' && hexStg[
n] <=
'f')
46 digit[
n] = (hexStg[
n] & 0x0f) + 9;
47 else if (hexStg[
n] >=
'A' && hexStg[
n] <=
'F')
48 digit[
n] = (hexStg[
n] & 0x0f) + 9;
59 intValue = intValue | (digit[
n] << (m << 2));
68int cDownloader::build_id(
int source,
int dest)
70 return (ICUBCANPROTO_CLASS_BOOTLOADER << 8) + ( source << 4) + dest;
73int cDownloader::get_src_from_id (
int id)
76 return ((
id >> 4) & 0x0F);
79int cDownloader::get_dst_from_id (
int id)
105 _externalLoggerFptr = logger;
106 _externalLoggerCaller = caller;
109void cDownloader::Log(
const std::string &msg)
111 yDebug() <<
"$" << msg;
113 if(NULL != _externalLoggerFptr)
115 _externalLoggerFptr(_externalLoggerCaller,
"$ " + msg);
124 if (m_idriver !=NULL)
126#if defined(DOWNLOADER_USE_IDRIVER2)
130 m_idriver->destroyBuffer(txBuffer);
131 m_idriver->destroyBuffer(rxBuffer);
149 if (m_idriver !=NULL)
158 if (config.find(
"device").asString()==
"ETH")
160#if defined(DOWNLOADER_USE_IDRIVER2)
166 if((1 != tmp) && (2 != tmp))
173#if defined(DOWNLOADER_USE_IDRIVER2)
178 tmp = config.check(
"canDeviceNum")?config.find(
"canDeviceNum").asInt32():99;
181 if (0 != (ret = m_idriver->
init(config, _verbose)))
195#if defined(DOWNLOADER_USE_IDRIVER2)
197 txBuffer[0].setCanBus(tmp);
201 rxBuffer[i].setCanBus(tmp);
204 txBuffer=m_idriver->createBuffer(1);
217 if (m_idriver == NULL)
219 if(_verbose) yError (
"Driver not ready\n");
224 txBuffer[0].setId((2 << 8) + target_id);
225 txBuffer[0].setLen(1);
226 txBuffer[0].getData()[0]= 0x09;
227 set_bus(txBuffer[0], bus);
232 if(_verbose) yError (
"Unable to send message\n");
239 for (
int i=0; i<read_messages; i++)
241 if (rxBuffer[i].getData()[0]==0x09 &&
242 rxBuffer[i].getId()==(2 << 8) + (target_id<<4))
244 if(rxBuffer[i].getData()[1]!=0)
246 if(_verbose) yInfo (
"Data has been saved in EEprom correctly\n");
251 if(_verbose) yError (
"Error in data saving in EEprom \n");
256 if(_verbose) yError (
"Save_to_eeprom didn't receive answer...maybe strain firmware is obsolete \n");
351 if (m_idriver == NULL)
353 if(_verbose) yError (
"Driver not ready\n");
358 txBuffer[0].setId((2 << 8) + target_id);
359 txBuffer[0].setLen(3);
360 txBuffer[0].getData()[0]= 0x0C;
361 txBuffer[0].getData()[1]= channel;
362 txBuffer[0].getData()[2]= type;
363 set_bus(txBuffer[0], bus);
368 if(_verbose) yError (
"Unable to send message\n");
376 for (
int i=0; i<read_messages; i++)
378 if (rxBuffer[i].getData()[0]==0x0C &&
379 rxBuffer[i].getId()==(2 << 8) + (target_id<<4))
381 int ret_channel = rxBuffer[i].getData()[1];
382 if (ret_channel == channel)
384 adc = rxBuffer[i].getData()[3]<<8 | rxBuffer[i].getData()[4];
389 if(_verbose) yError (
"strain_get_adc : invalid response\n");
402 if (m_idriver == NULL)
404 if(_verbose) yError (
"Driver not ready\n");
409 txBuffer[0].setId((2 << 8) + target_id);
410 txBuffer[0].setLen(2);
411 txBuffer[0].getData()[0]= 0x0B;
412 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (channel & 0x0f);
415 set_bus(txBuffer[0], bus);
421 for (
int i=0; i<read_messages; i++)
423 if (rxBuffer[i].getData()[0]==0x0B &&
424 rxBuffer[i].getId()==(2 << 8) + (target_id<<4))
426 int ret_channel = rxBuffer[i].getData()[1] & 0x0f;
427 if (channel==ret_channel)
429 offset = rxBuffer[i].getData()[2]<<8 | rxBuffer[i].getData()[3];
434 if(_verbose) yError (
"strain_get_offset : invalid response\n");
447 if (m_idriver == NULL)
449 if(_verbose) yError (
"Driver not ready\n");
454 txBuffer[0].setId((2 << 8) + target_id);
455 txBuffer[0].setLen(2);
456 txBuffer[0].getData()[0]= 0x14;
457 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (channel & 0x0f);
458 set_bus(txBuffer[0], bus);
462 for (
int i=0; i<read_messages; i++)
464 if (rxBuffer[i].getData()[0]==0x14 &&
465 rxBuffer[i].getId()==(2 << 8) + (target_id<<4))
467 bias = rxBuffer[i].getData()[2]<<8 | rxBuffer[i].getData()[3];
479 if (m_idriver == NULL)
481 if(_verbose) yError (
"Driver not ready\n");
486 txBuffer[0].setId((2 << 8) + target_id);
487 txBuffer[0].setLen(2);
488 txBuffer[0].getData()[0]= 0x13;
489 txBuffer[0].getData()[1]= 1;
490 set_bus(txBuffer[0], bus);
500 if (m_idriver == NULL)
502 if(_verbose) yError (
"Driver not ready\n");
507 txBuffer[0].setId((2 << 8) + target_id);
508 txBuffer[0].setLen(5);
509 txBuffer[0].getData()[0]= 0x13;
510 txBuffer[0].getData()[1]= 2;
511 txBuffer[0].getData()[2]= ((regset << 4) & 0xf0) | (channel & 0x0f);
512 txBuffer[0].getData()[3]= bias >> 8;
513 txBuffer[0].getData()[4]= bias & 0xFF;
515 set_bus(txBuffer[0], bus);
527 if (m_idriver == NULL)
529 if(_verbose) yError (
"Driver not ready\n");
534 txBuffer[0].setId((2 << 8) + target_id);
535 txBuffer[0].setLen(2);
536 txBuffer[0].getData()[0]= 0x13;
537 txBuffer[0].getData()[1]= 0;
538 set_bus(txBuffer[0], bus);
548 if (m_idriver == NULL)
550 if(_verbose) yError (
"Driver not ready\n");
555 txBuffer[0].setId((2 << 8) + target_id);
556 txBuffer[0].setLen(2);
557 txBuffer[0].getData()[0]= 0x16;
558 txBuffer[0].getData()[1]= channel;
559 set_bus(txBuffer[0], bus);
563 for (
int i=0; i<read_messages; i++)
565 if (rxBuffer[i].getData()[0]==0x16 &&
566 rxBuffer[i].getId()==(2 << 8) + (target_id<<4))
568 bias = rxBuffer[i].getData()[2]<<8 | rxBuffer[i].getData()[3];
578 if (m_idriver == NULL)
580 if(_verbose) yError (
"Driver not ready\n");
585 txBuffer[0].setId((2 << 8) + target_id);
586 txBuffer[0].setLen(2);
587 txBuffer[0].getData()[0]= 0x15;
588 txBuffer[0].getData()[1]= 1;
589 set_bus(txBuffer[0], bus);
600 if (m_idriver == NULL)
602 if(_verbose) yError (
"Driver not ready\n");
607 txBuffer[0].setId((2 << 8) + target_id);
608 txBuffer[0].setLen(5);
609 txBuffer[0].getData()[0]= 0x15;
610 txBuffer[0].getData()[1]= 2;
611 txBuffer[0].getData()[3]= channel;
612 txBuffer[0].getData()[4]= bias >> 8;
613 txBuffer[0].getData()[5]= bias & 0xFF;
615 set_bus(txBuffer[0], bus);
625 if (m_idriver == NULL)
627 if(_verbose) yError (
"Driver not ready\n");
632 txBuffer[0].setId((2 << 8) + target_id);
633 txBuffer[0].setLen(2);
634 txBuffer[0].getData()[0]= 0x15;
635 txBuffer[0].getData()[1]= 0;
636 set_bus(txBuffer[0], bus);
647 if (m_idriver == NULL)
649 if(_verbose) yError (
"Driver not ready\n");
654 txBuffer[0].setId((2 << 8) + target_id);
655 txBuffer[0].setLen(8);
656 txBuffer[0].getData()[0]= 0x19;
657 txBuffer[0].getData()[1]= serial_number[0];
658 txBuffer[0].getData()[2]= serial_number[1];
659 txBuffer[0].getData()[3]= serial_number[2];
660 txBuffer[0].getData()[4]= serial_number[3];
661 txBuffer[0].getData()[5]= serial_number[4];
662 txBuffer[0].getData()[6]= serial_number[5];
663 txBuffer[0].getData()[7]= serial_number[6];
664 set_bus(txBuffer[0], bus);
675 if (m_idriver == NULL)
677 if(_verbose) yError (
"Driver not ready\n");
682 txBuffer[0].setId((2 << 8) + target_id);
683 txBuffer[0].setLen(1);
684 txBuffer[0].getData()[0]= 0x1A;
687 set_bus(txBuffer[0], bus);
693 for (
int i=0; i<read_messages; i++)
695 if (rxBuffer[i].getData()[0]==0x1A &&
696 rxBuffer[i].getId()==(2 << 8) + (target_id<<4))
698 serial_number[0] = rxBuffer[i].getData()[1];
699 serial_number[1] = rxBuffer[i].getData()[2];
700 serial_number[2] = rxBuffer[i].getData()[3];
701 serial_number[3] = rxBuffer[i].getData()[4];
702 serial_number[4] = rxBuffer[i].getData()[5];
703 serial_number[5] = rxBuffer[i].getData()[6];
704 serial_number[6] = rxBuffer[i].getData()[7];
705 serial_number[7] = 0;
716 if (m_idriver == NULL)
718 if(_verbose) yError (
"Driver not ready\n");
723 txBuffer[0].setId((2 << 8) + target_id);
724 txBuffer[0].setLen(1);
725 txBuffer[0].getData()[0]= 0x1B;
728 set_bus(txBuffer[0], bus);
734 for (
int i=0; i<read_messages; i++)
736 if (rxBuffer[i].getData()[0]==0x1B &&
737 rxBuffer[i].getId()==(2 << 8) + (target_id<<4))
739 *status = rxBuffer[i].getData()[1]!=0;
749 if (m_idriver == NULL)
751 if(_verbose) yError (
"Driver not ready\n");
756 txBuffer[0].setId((2 << 8) + target_id);
757 txBuffer[0].setLen(1);
758 txBuffer[0].getData()[0]= 0x12;
761 set_bus(txBuffer[0], bus);
767 for (
int i=0; i<read_messages; i++)
769 if (rxBuffer[i].getData()[0]==0x12 &&
770 rxBuffer[i].getId()==(2 << 8) + (target_id<<4))
772 gain = rxBuffer[i].getData()[1];
811 if (m_idriver == NULL)
813 if(_verbose) yError (
"Driver not ready\n");
823 txBuffer[0].setId((2 << 8) + target_id);
824 txBuffer[0].setLen(2);
825 txBuffer[0].getData()[0]= 0x3D;
826 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (regsetmode & 0x0f);
828 set_bus(txBuffer[0], bus);
846 if (m_idriver == NULL)
848 if(_verbose) yError (
"Driver not ready\n");
853 txBuffer[0].setId((2 << 8) + target_id);
854 txBuffer[0].setLen(2);
855 txBuffer[0].getData()[0]= 0x3E;
856 txBuffer[0].getData()[1]= (regsetmode & 0x0f);
859 set_bus(txBuffer[0], bus);
865 for (
int i=0; i<read_messages; i++)
867 if (rxBuffer[i].getData()[0]== 0x3E &&
868 rxBuffer[i].getId()==(2 << 8) + (target_id<<4))
870 int rregset = (rxBuffer[i].getData()[1] >> 4) & 0x0F;
871 int rregsetmode = (rxBuffer[i].getData()[1]) & 0x0F;
872 if (rregsetmode == regsetmode)
879 if(_verbose) yError (
"strain_get_regulationset : invalid response\n");
894 if (m_idriver == NULL)
896 if(_verbose) yError (
"Driver not ready\n");
901 txBuffer[0].setId((2 << 8) + target_id);
902 txBuffer[0].setLen(2);
903 txBuffer[0].getData()[0]= 0x11;
904 txBuffer[0].getData()[1]= gain;
906 set_bus(txBuffer[0], bus);
916 if (m_idriver == NULL)
918 if(_verbose) yError (
"Driver not ready\n");
924 txBuffer[0].setId((2 << 8) + target_id);
925 txBuffer[0].setLen(8);
926 txBuffer[0].getData()[0]= 0x2B;
927 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (channel & 0x0f);
928 txBuffer[0].getData()[2]= ampregs.
data[0];
929 txBuffer[0].getData()[3]= ampregs.
data[1];
930 txBuffer[0].getData()[4]= ampregs.
data[2];
931 txBuffer[0].getData()[5]= ampregs.
data[3];
932 txBuffer[0].getData()[6]= ampregs.
data[4];
933 txBuffer[0].getData()[7]= ampregs.
data[5];
934 set_bus(txBuffer[0], bus);
940 yarp::os::Time::delay(0.010);
950 if (m_idriver == NULL)
952 if(_verbose) yError (
"Driver not ready\n");
958 txBuffer[0].setId((2 << 8) + target_id);
959 txBuffer[0].setLen(2);
960 txBuffer[0].getData()[0]= 0x2A;
961 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (channel & 0x0f);;
962 set_bus(txBuffer[0], bus);
969 yarp::os::Time::delay(0.010);
972 for(
int i=0; i<rm; i++)
974 if (rxBuffer[i].getData()[0]==0x2A)
976 ampregs.
data[0] = rxBuffer[i].getData()[2];
977 ampregs.
data[1] = rxBuffer[i].getData()[3];
978 ampregs.
data[2] = rxBuffer[i].getData()[4];
979 ampregs.
data[3] = rxBuffer[i].getData()[5];
980 ampregs.
data[4] = rxBuffer[i].getData()[6];
981 ampregs.
data[5] = rxBuffer[i].getData()[7];
995 static const float mapofgains[ampl_gain_numberOf] =
997 256 , 128 , 96 , 64 , 48, 36, 24, 20, 16, 10, 8, 6, 4
1000 unsigned int index =
static_cast<unsigned int>(c);
1001 if(index >= ampl_gain_numberOf)
1003 if(_verbose) yError (
"strain_amplifier_discretegain2float(): cannot convert to a valid value\n");
1006 return mapofgains[index];
1012 if (m_idriver == NULL)
1014 if(_verbose) yError (
"Driver not ready\n");
1020 #define _NUMofREGS 6
1038 static const uint8_t _cfg1map[ampl_gain_numberOf][
_NUMofREGS] =
1041 {0x00, 0x80, 0x66, 0x06, 0xcb, 0x80},
1042 {0x00, 0x80, 0x56, 0x0c, 0xcb, 0x80},
1043 {0x00, 0x40, 0x56, 0x10, 0x0f, 0x81},
1044 {0x00, 0x80, 0x46, 0x17, 0x6d, 0x7f},
1045 {0x00, 0x40, 0x46, 0x1f, 0xb1, 0x7f},
1046 {0x00, 0x10, 0x46, 0x2a, 0x80, 0x80},
1047 {0x00, 0x40, 0x42, 0x3e, 0x62, 0x7f},
1048 {0x00, 0x20, 0x42, 0x4b, 0x15, 0x80},
1049 {0x00, 0x00, 0x42, 0x5e, 0x72, 0x80},
1050 {0x00, 0xC0, 0x02, 0x64, 0xf6, 0x6e},
1051 {0x00, 0x80, 0x02, 0x64, 0x29, 0x62},
1052 {0x00, 0x40, 0x02, 0x64, 0xd4, 0x4c},
1053 {0x00, 0x40, 0x00, 0x64, 0x29, 0x22}
1057 unsigned int index =
static_cast<unsigned int>(ampcfg);
1059 if(index >= ampl_gain_numberOf)
1061 if(_verbose) yError (
"strain_set_amplifier_discretegain(): cannot convert to a valid index\n");
1066 txBuffer[0].setId((2 << 8) + target_id);
1067 txBuffer[0].setLen(8);
1068 txBuffer[0].getData()[0]= 0x2B;
1069 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (channel & 0x0f);
1070 txBuffer[0].getData()[2]= _cfg1map[index][0];
1071 txBuffer[0].getData()[3]= _cfg1map[index][1];
1072 txBuffer[0].getData()[4]= _cfg1map[index][2];
1073 txBuffer[0].getData()[5]= _cfg1map[index][3];
1074 txBuffer[0].getData()[6]= _cfg1map[index][4];
1075 txBuffer[0].getData()[7]= _cfg1map[index][5];
1076 set_bus(txBuffer[0], bus);
1077 if(_verbose) yDebug(
"strain_set_amplifier_discretegain() is sending: [%x, %x, %x, %x, %x, %x, %x, %x]", txBuffer[0].getData()[0], txBuffer[0].getData()[1], txBuffer[0].getData()[2], txBuffer[0].getData()[3], txBuffer[0].getData()[4], txBuffer[0].getData()[5], txBuffer[0].getData()[6], txBuffer[0].getData()[7]);
1082 yarp::os::Time::delay(0.010);
1091 if (m_idriver == NULL)
1093 if(_verbose) yError (
"Driver not ready\n");
1097 txBuffer[0].setId((2 << 8) + target_id);
1098 txBuffer[0].setLen(2);
1099 txBuffer[0].getData()[0]= 0x20;
1100 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (channel & 0x0f);
1101 set_bus(txBuffer[0], bus);
1108 for(
int i=0; i<rm; i++)
1110 if (rxBuffer[i].getData()[0]==0x20)
1114 uint16_t g16 =
static_cast<uint16_t
>(rxBuffer[i].getData()[2]) |
static_cast<uint16_t
>(rxBuffer[i].getData()[3]) << 8;
1115 float fg =
static_cast<float>(g16) / 100;
1117 uint16_t o16 =
static_cast<uint16_t
>(rxBuffer[i].getData()[4]) |
static_cast<uint16_t
>(rxBuffer[i].getData()[5]) << 8;
1130 if (m_idriver == NULL)
1132 if(_verbose) yError (
"Driver not ready\n");
1137 txBuffer[0].setId((2 << 8) + target_id);
1138 txBuffer[0].setLen(7);
1139 txBuffer[0].getData()[0]= 0x21;
1140 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (channel & 0x0f);
1141 txBuffer[0].getData()[2]= 0;
1142 uint16_t gg =
static_cast<uint16_t
>(gain*100.0f);
1143 txBuffer[0].getData()[3] = (gg & 0x00ff);
1144 txBuffer[0].getData()[4] = (gg & 0xff00) >> 8;
1145 txBuffer[0].getData()[5] = (
offset & 0x00ff);
1146 txBuffer[0].getData()[6] = (
offset & 0xff00) >> 8;
1148 set_bus(txBuffer[0], bus);
1164 if(
false == convert(wp, dp))
1166 if(_verbose) yError (
"cannot load this pair gain-offset into the strain2\n");
1187 if (m_idriver == NULL)
1189 if(_verbose) yError (
"Driver not ready\n");
1194 txBuffer[0].setId((2 << 8) + target_id);
1195 txBuffer[0].setLen(2);
1196 txBuffer[0].getData()[0]= 0x18;
1197 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (channel & 0x0f);
1199 set_bus(txBuffer[0], bus);
1205 for (
int i=0; i<read_messages; i++)
1207 std::uint8_t data1 = rxBuffer[0].getData()[1];
1208 std::uint8_t rs = (data1 >> 4) & 0x0f;
1209 std::uint8_t cc = (data1 ) & 0x0f;
1211 if (rxBuffer[i].getData()[0]==0x18 &&
1212 rxBuffer[i].getId()==(2 << 8) + (target_id<<4))
1214 full_scale = rxBuffer[i].getData()[2]<<8 | rxBuffer[i].getData()[3];
1224 if (m_idriver == NULL)
1226 if(_verbose) yError (
"Driver not ready\n");
1231 txBuffer[0].setId((2 << 8) + target_id);
1232 txBuffer[0].setLen(4);
1233 txBuffer[0].getData()[0]= 0x17;
1234 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (channel & 0x0f);
1235 txBuffer[0].getData()[2]= full_scale >> 8;
1236 txBuffer[0].getData()[3]= full_scale & 0xFF;
1238 set_bus(txBuffer[0], bus);
1248 if (m_idriver == NULL)
1250 if(_verbose) yError (
"Driver not ready\n");
1255 txBuffer[0].setId((2 << 8) + target_id);
1256 txBuffer[0].setLen(3);
1257 txBuffer[0].getData()[0]= 0x0A;
1258 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (r & 0x0f);
1259 txBuffer[0].getData()[2]= c;
1262 set_bus(txBuffer[0], bus);
1268 for (
int i=0; i<read_messages; i++)
1270 if (rxBuffer[i].getData()[0]==0x0A &&
1271 rxBuffer[i].getId()==(2 << 8) + (target_id<<4))
1273 int ret_r = (rxBuffer[i].getData()[1]) & 0x0f;
1274 int ret_c = rxBuffer[i].getData()[2];
1275 if ((r==ret_r) && (c==ret_c))
1277 elem = rxBuffer[i].getData()[3]<<8 | rxBuffer[i].getData()[4];
1282 if(_verbose) yError (
"strain_get_matrix_rc : invalid response\n");
1294 if (m_idriver == NULL)
1296 if(_verbose) yError (
"Driver not ready\n");
1301 txBuffer[0].setId((2 << 8) + target_id);
1302 txBuffer[0].setLen(5);
1303 txBuffer[0].getData()[0]= 0x03;
1304 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (r & 0x0f);
1305 txBuffer[0].getData()[2]= c;
1306 txBuffer[0].getData()[3]= elem >> 8;
1307 txBuffer[0].getData()[4]= elem & 0xFF;
1308 set_bus(txBuffer[0], bus);
1319 if (m_idriver == NULL)
1321 if(_verbose) yError (
" Driver not ready\n");
1326 txBuffer[0].setId((2 << 8) + target_id);
1327 txBuffer[0].setLen(4);
1328 txBuffer[0].getData()[0]= 0x04;
1329 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (channel & 0x0f);;
1330 txBuffer[0].getData()[2]=
offset >> 8;
1331 txBuffer[0].getData()[3]=
offset & 0xFF;
1332 set_bus(txBuffer[0], bus);
1354 if (m_idriver == NULL)
1356 if(_verbose) yError (
"Driver not ready\n");
1371 txBuffer[0].setId((2 << 8) + target_id);
1372 txBuffer[0].setLen(2);
1373 txBuffer[0].getData()[0]= 0x08;
1374 txBuffer[0].getData()[1]= txratemilli;
1375 set_bus(txBuffer[0], bus);
1380 if(_verbose) yError (
"Unable to send txrate set message\n");
1385 txBuffer[0].setId((2 << 8) + target_id);
1386 txBuffer[0].setLen(2);
1387 txBuffer[0].getData()[0]= 0x07;
1388 txBuffer[0].getData()[1]= (
false == calibmode) ? (0x03) : (0x00);
1389 set_bus(txBuffer[0], bus);
1394 if(_verbose) yError (
"Unable to send start tx message\n");
1398 strain_is_acquiring_in_calibratedmode = calibmode;
1407 if (m_idriver == NULL)
1409 if(_verbose) yError (
"Driver not ready\n");
1419 txBuffer[0].setId((2 << 8) + target_id);
1420 txBuffer[0].setLen(2);
1421 txBuffer[0].getData()[0]= 0x07;
1422 txBuffer[0].getData()[1]= 0x02;
1423 set_bus(txBuffer[0], bus);
1428 if(_verbose) yError (
"Unable to send stop tx message\n");
1435 const double TOUT = 0.100;
1436 const size_t maxframes = rxBuffer.size() - 1;
1437 for(
size_t n=0;
n<10;
n++)
1439 int read_messages = m_idriver->
receive_message(rxBuffer, maxframes, TOUT);
1441 if(0 == read_messages)
1462 unsigned int errorcount = 0;
1469 yDebug() <<
"cDownloader::strain_acquire_get() is using polling";
1472 for (
unsigned int s = 0; s < howmany; s++)
1477 for (
int c = 0; c < 6; c++)
1480 unsigned int adc = 0;
1485 yDebug() <<
"error in acquisition of an adc channel " << c <<
"incrementing error counter to" << errorcount;
1486 if (errorcount >= maxerrors)
1488 yError() <<
"reached" << maxerrors <<
"reception errors in adc acquisition: must quit";
1494 values.push_back(sv);
1496 if (NULL != updateProgressBar)
1498 float perc = (0 != howmany) ? (
static_cast<float>(s + 1) /
static_cast<float>(howmany)) : (100.0);
1499 updateProgressBar(arg, perc);
1506 const double TOUT = 3.0;
1514 for(
unsigned int s=0; s<howmany; s++)
1517 if(NULL != updateProgressBar)
1519 float perc = (0 != howmany) ? (
static_cast<float>(s+1)/
static_cast<float>(howmany)) : (100.0);
1520 updateProgressBar(arg, perc);
1529 if(2 == read_messages)
1531 for(
unsigned int i=0; i<2; i++)
1533 uint32_t
id = rxBuffer[i].getId();
1534 uint8_t type =
id & 0xf;
1536 if((0xA != type) && (0xB != type))
1538 yError() <<
"cDownloader::strain_acquire_get() has detected strange can frames of type = " << type <<
".... operation aborted";
1539 char rxframe[128] = {0};
1540 snprintf(rxframe,
sizeof(rxframe),
"l = %d, id = 0x%x, d = 0x[%x %x %x %x %x %x %x %x]", rxBuffer[i].getLen(), rxBuffer[i].getId(),
1541 rxBuffer[i].getData()[0], rxBuffer[i].getData()[1], rxBuffer[i].getData()[2], rxBuffer[i].getData()[3],
1542 rxBuffer[i].getData()[4], rxBuffer[i].getData()[5], rxBuffer[i].getData()[6], rxBuffer[i].getData()[7]);
1544 yError() <<
"frame -> " << rxframe;
1550 uint16_t
x =
static_cast<uint16_t
>(rxBuffer[i].getData()[0]) | (
static_cast<uint16_t
>(rxBuffer[i].getData()[1]) << 8);
1551 uint16_t
y =
static_cast<uint16_t
>(rxBuffer[i].getData()[2]) | (
static_cast<uint16_t
>(rxBuffer[i].getData()[3]) << 8);
1552 uint16_t
z =
static_cast<uint16_t
>(rxBuffer[i].getData()[4]) | (
static_cast<uint16_t
>(rxBuffer[i].getData()[5]) << 8);
1554 sv.
saturated = (6 == rxBuffer[i].getLen()) ? (
true) : (
false);
1557 sv.
calibrated = strain_is_acquiring_in_calibratedmode;
1568 void *tmp = &rxBuffer[i].getData()[6];
1569 icubCanProto_strain_forceSaturationInfo_t *sinfo =
reinterpret_cast<icubCanProto_strain_forceSaturationInfo_t*
>(tmp);
1570 if(1 == sinfo->thereIsSaturationInAtLeastOneChannel)
1572 sv.
saturationinfo[0] =
static_cast<icubCanProto_strain_saturationInfo_t
>(sinfo->saturationInChannel_0);
1573 sv.
saturationinfo[1] =
static_cast<icubCanProto_strain_saturationInfo_t
>(sinfo->saturationInChannel_1);
1574 sv.
saturationinfo[2] =
static_cast<icubCanProto_strain_saturationInfo_t
>(sinfo->saturationInChannel_2);
1578 else if(0xB == type)
1587 void *tmp = &rxBuffer[i].getData()[6];
1588 icubCanProto_strain_torqueSaturationInfo_t *sinfo =
reinterpret_cast<icubCanProto_strain_torqueSaturationInfo_t*
>(tmp);
1589 if(1 == sinfo->thereIsSaturationInAtLeastOneChannel)
1591 sv.
saturationinfo[3] =
static_cast<icubCanProto_strain_saturationInfo_t
>(sinfo->saturationInChannel_3);
1592 sv.
saturationinfo[4] =
static_cast<icubCanProto_strain_saturationInfo_t
>(sinfo->saturationInChannel_4);
1593 sv.
saturationinfo[5] =
static_cast<icubCanProto_strain_saturationInfo_t
>(sinfo->saturationInChannel_5);
1606 yDebug() <<
"cDownloader::strain_acquire_get(): did not receive two consecutive 0xA and 0xB. please check!";
1610 values.push_back(sv);
1616 yDebug() <<
"in streaming mode did not received two messages but " << read_messages <<
"incrementing error counter to" << errorcount;
1617 if(errorcount >= maxerrors)
1619 yError() <<
"reached" << maxerrors <<
"reception errors: must quit";
1636 if (m_idriver == NULL)
1638 if(_verbose) yError (
"Driver not ready\n");
1643 txBuffer[0].setId((2 << 8) + target_id);
1644 txBuffer[0].setLen(2);
1645 txBuffer[0].getData()[0]= 0x07;
1646 txBuffer[0].getData()[1]= 0x01;
1647 set_bus(txBuffer[0], bus);
1652 if(_verbose) yError (
"Unable to send message\n");
1662 if (m_idriver == NULL)
1664 if(_verbose) yError (
"Driver not ready\n");
1669 txBuffer[0].setId((2 << 8) + target_id);
1670 txBuffer[0].setLen(2);
1671 txBuffer[0].getData()[0]= 0x07;
1672 txBuffer[0].getData()[1]= 0x02;
1673 set_bus(txBuffer[0], bus);
1678 if(_verbose) yError (
"Unable to send message\n");
1699int cDownloader::strain_calibrate_offset2 (
int bus,
int target_id, icubCanProto_boardType_t boardtype,
const std::vector<strain2_ampl_discretegain_t> &gains,
const std::vector<int16_t> &targets,
string *errorstring)
1702 if(icubCanProto_boardType__strain == boardtype)
1704 int16_t i16 = (targets.empty()) ? (0) : (targets[0]);
1706 return strain_calibrate_offset2_strain1(bus, target_id, i16, errorstring);
1708 else if(icubCanProto_boardType__strain2 == boardtype || icubCanProto_boardType__strain2c == boardtype)
1710 return strain_calibrate_offset2_strain2(bus, target_id, gains, targets, errorstring);
1699int cDownloader::strain_calibrate_offset2 (
int bus,
int target_id, icubCanProto_boardType_t boardtype,
const std::vector<strain2_ampl_discretegain_t> &gains,
const std::vector<int16_t> &targets,
string *errorstring) {
…}
1724 if (m_idriver == NULL)
1726 if(_verbose) yError (
"Driver not ready\n");
1730 int daclimit = 0x3ff;
1734#define STRAIN2_USE_NEW_MODE
1736#if !defined(STRAIN2_USE_NEW_MODE)
1737 if(icubCanProto_boardType__strain2 == boardtype || icubCanProto_boardType__strain2c == boardtype)
1744 if(icubCanProto_boardType__strain2 == boardtype || icubCanProto_boardType__strain2c == boardtype)
1746 yDebug() <<
"strain2-amplifier-tuning: see the various STEP-x";
1748 const uint8_t everychannel = 0x0f;
1750 uint8_t samples2average = 8;
1752#define TESTMODE_STRAIN2
1753#undef TESTMODE_STRAIN2_SAMEGAIN
1757#if defined(TESTMODE_STRAIN2)
1759 const unsigned int NUMofCHANNELS = 6;
1762#if defined(TESTMODE_STRAIN2_SAMEGAIN)
1764 const int i2u_all = index24;
1766 yDebug() <<
"imposing gain =" << gainvalues[i2u_all] <<
"in every channel";
1768 txBuffer[0].setId((2 << 8) + target_id);
1769 txBuffer[0].setLen(8);
1770 txBuffer[0].getData()[0]= 0x2B;
1771 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (everychannel & 0x0f);
1772 txBuffer[0].getData()[2]= cfg1map[i2u_all][0];
1773 txBuffer[0].getData()[3]= cfg1map[i2u_all][1];
1774 txBuffer[0].getData()[4]= cfg1map[i2u_all][2];
1775 txBuffer[0].getData()[5]= cfg1map[i2u_all][3];
1776 txBuffer[0].getData()[6]= cfg1map[i2u_all][4];
1777 txBuffer[0].getData()[7]= cfg1map[i2u_all][5];
1778 set_bus(txBuffer[0], bus);
1779 yDebug(
"sending: [%x, %x, %x, %x, %x, %x, %x, %x]", txBuffer[0].getData()[0], txBuffer[0].getData()[1], txBuffer[0].getData()[2], txBuffer[0].getData()[3], txBuffer[0].getData()[4], txBuffer[0].getData()[5], txBuffer[0].getData()[6], txBuffer[0].getData()[7]);
1784 yarp::os::Time::delay(1.0);
1789#if defined(DEBUGLEVEL_MAXIMUM)
1791 yDebug() <<
"reading (gain, offset) of front end amplifiers";
1793 for(
int c=0; c<NUMofCHANNELS; c++)
1796 uint16_t ooffset = 0;
1798 yDebug(
"channel %d: gain = %f, offset = %d", c, gaain, ooffset);
1807 yDebug() <<
"i get the amplifier reg config";
1809 txBuffer[0].setId((2 << 8) + target_id);
1810 txBuffer[0].setLen(2);
1811 txBuffer[0].getData()[0]= 0x2A;
1812 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (everychannel & 0x0f);
1813 set_bus(txBuffer[0], bus);
1816 yDebug() <<
"i print the amplifier reg config";
1818 for(
int nr=0; nr<NUMofCHANNELS; nr++)
1821 for(
int i=0; i<rm; i++)
1823 if (rxBuffer[i].getData()[0]==0x2A)
1826 uint8_t from = rxBuffer[i].getData()[1];
1827 yDebug(
"from %d: [%x, %x, %x, %x, %x, %x]", from, rxBuffer[i].getData()[2], rxBuffer[i].getData()[3], rxBuffer[i].getData()[4], rxBuffer[i].getData()[5], rxBuffer[i].getData()[6], rxBuffer[i].getData()[7]);
1833 yarp::os::Time::delay(2.0);
1848 yDebug() <<
"strain2-amplifier-tuning: STEP-1. imposing gains which are different of each channel";
1850 for(
int channel=0; channel<NUMofCHANNELS; channel++)
1857 yarp::os::Time::delay(1.0);
1866 yDebug() <<
"strain2-amplifier-tuning: STEP-2. reading (gain, offset) of front end amplifiers";
1868 for(
int c=0; c<NUMofCHANNELS; c++)
1871 uint16_t ooffset = 0;
1873 yDebug(
"strain2-amplifier-tuning: STEP-2. channel %d: gain = %f, offset = %d", c, gaain, ooffset);
1876 yarp::os::Time::delay(2.0);
1879#if defined(DEBUGLEVEL_MAXIMUM)
1881 yDebug() <<
"i get the amplifier reg config";
1883 txBuffer[0].setId((2 << 8) + target_id);
1884 txBuffer[0].setLen(2);
1885 txBuffer[0].getData()[0]= 0x2A;
1886 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (everychannel & 0x0f);
1887 set_bus(txBuffer[0], bus);
1890 yDebug() <<
"i print the amplifier reg config";
1892 for(
int nr=0; nr<NUMofCHANNELS; nr++)
1895 for(
int i=0; i<rm; i++)
1897 if (rxBuffer[i].getData()[0]==0x2A)
1900 uint8_t from = rxBuffer[i].getData()[1];
1901 yDebug(
"from %d: [%x, %x, %x, %x, %x, %x]", from, rxBuffer[i].getData()[2], rxBuffer[i].getData()[3], rxBuffer[i].getData()[4], rxBuffer[i].getData()[5], rxBuffer[i].getData()[6], rxBuffer[i].getData()[7]);
1907 yarp::os::Time::delay(2.0);
1918 yDebug() <<
"strain2-amplifier-tuning: STEP-3. regularisation of ADC to " << middle_val;
1919 yDebug() <<
"strain2-amplifier-tuning: STEP-3. other params: mae tolerence is" <<
tolerance <<
"and samples2average =" << samples2average;
1923 txBuffer[0].setId((2 << 8) + target_id);
1924 txBuffer[0].setLen(8);
1925 txBuffer[0].getData()[0]= 0x22;
1926 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (everychannel & 0x0f);
1927 txBuffer[0].getData()[2]= 0;
1928 txBuffer[0].getData()[3]= middle_val & 0x00ff;
1929 txBuffer[0].getData()[4]= (middle_val >> 8) & 0x00ff;
1930 txBuffer[0].getData()[5]=
tolerance & 0x00ff;
1931 txBuffer[0].getData()[6]= (
tolerance >> 8) & 0x00ff;
1932 txBuffer[0].getData()[7]= samples2average;
1933 set_bus(txBuffer[0], bus);
1934 yDebug(
"strain2-amplifier-tuning: STEP-3. sent message = [%x, %x, %x, %x, %x, %x, %x, %x]", txBuffer[0].getData()[0], txBuffer[0].getData()[1], txBuffer[0].getData()[2], txBuffer[0].getData()[3], txBuffer[0].getData()[4], txBuffer[0].getData()[5], txBuffer[0].getData()[6], txBuffer[0].getData()[7]);
1939 if(_verbose) yError (
"Unable to send message\n");
1946 yDebug() <<
"strain2-amplifier-tuning: STEP-3. results ...";
1949 for(
int i=0; i<read_messages; i++)
1951 if (rxBuffer[i].getData()[0]==0x22)
1953 yDebug(
"strain2-amplifier-tuning: STEP-3. received message = [%x, %x, %x, %x, %x, %x, %x, %x]", rxBuffer[0].getData()[0], rxBuffer[0].getData()[1], rxBuffer[0].getData()[2], rxBuffer[0].getData()[3], rxBuffer[0].getData()[4], rxBuffer[0].getData()[5], rxBuffer[0].getData()[6], rxBuffer[0].getData()[7]);
1956 uint8_t noisychannelmask = rxBuffer[i].getData()[2];
1957 uint8_t algorithmOKmask = rxBuffer[i].getData()[3];
1958 uint8_t finalmeasureOKmask = rxBuffer[i].getData()[4];
1959 uint16_t mae = (
static_cast<uint32_t
>(rxBuffer[i].getData()[6])) |
1960 (
static_cast<uint32_t
>(rxBuffer[i].getData()[7]) << 8);
1962 if((0x3f == algorithmOKmask) && (0x3f == finalmeasureOKmask))
1964 yDebug() <<
"strain2-amplifier-tuning: STEP-3. OK. regularisation to value" << middle_val <<
"is done and MAE = " << mae;
1965 if(0 != noisychannelmask)
1967 yDebug() <<
"however we found some noisy channels";
1968 yDebug(
"noisychannelmask = 0x%x, algorithmOKmask = 0x%x, finalmeasureOKmask = 0x%x, mae = %d", noisychannelmask, algorithmOKmask, finalmeasureOKmask, mae);
1975 if(0x3f != algorithmOKmask)
1977 yDebug() <<
"strain2-amplifier-tuning: STEP-3. KO. regularisation to value" << middle_val <<
"has sadly failed because algorithm found required values out of range of registers CFG0.OS or ZDAC.";
1981 yDebug() <<
"strain2-amplifier-tuning: STEP-3. KO. regularisation to value" << middle_val <<
"has failed because MAE error is high on some channels.";
1984 yDebug(
"noisychannelmask = 0x%x, algorithmOKmask = 0x%x, finalmeasureOKmask = 0x%x, mae = %d", noisychannelmask, algorithmOKmask, finalmeasureOKmask, mae);
1985 for(uint8_t i=0; i<NUMofCHANNELS; i++)
1987 if((algorithmOKmask & (0x01<<i)) == 0)
1989 yDebug() <<
"calibration fails in channel" << i;
1991 if((finalmeasureOKmask & (0x01<<i)) == 0)
1993 yDebug() <<
"mae is high in channel" << i;
2011 unsigned int measure = 0;
2012 unsigned int dac = 0;
2016 for (channel=0; channel<6; channel++)
2020 txBuffer[0].setId((2 << 8) + target_id);
2021 txBuffer[0].setLen(3);
2022 txBuffer[0].getData()[0]= 0x0C;
2023 txBuffer[0].getData()[1]= channel;
2024 txBuffer[0].getData()[2]= 0;
2025 set_bus(txBuffer[0], bus);
2030 if(_verbose) yError (
"Unable to send message\n");
2035 for (i=0; i<read_messages; i++)
2037 if (rxBuffer[i].getData()[0]==0x0C)
2039 measure = rxBuffer[i].getData()[3]<<8 | rxBuffer[i].getData()[4];
2045 txBuffer[0].setId((2 << 8) + target_id);
2046 txBuffer[0].setLen(2);
2047 txBuffer[0].getData()[0]= 0x0B;
2048 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (channel & 0x0f);
2049 set_bus(txBuffer[0], bus);
2053 for (i=0; i<read_messages; i++)
2055 if (rxBuffer[i].getData()[0]==0x0B)
2057 dac = rxBuffer[i].getData()[2]<<8 | rxBuffer[i].getData()[3];
2062 error = long(measure) - long(middle_val);
2067 if (
error>0) dac -= dacstep;
2068 else dac += dacstep;
2070 if (dac>daclimit) dac = daclimit;
2076 txBuffer[0].setId((2 << 8) + target_id);
2077 txBuffer[0].setLen(4);
2078 txBuffer[0].getData()[0]= 0x04;
2079 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (channel & 0x0f);
2080 txBuffer[0].getData()[2]= dac >> 8;
2081 txBuffer[0].getData()[3]= dac & 0xFF;
2082 set_bus(txBuffer[0], bus);
2089 txBuffer[0].setId((2 << 8) + target_id);
2090 txBuffer[0].setLen(3);
2091 txBuffer[0].getData()[0]= 0x0C;
2092 txBuffer[0].getData()[1]= channel;
2093 txBuffer[0].getData()[2]= 0;
2094 set_bus(txBuffer[0], bus);
2099 if(_verbose) yError (
"Unable to send message\n");
2104 for (i=0; i<read_messages; i++)
2106 if (rxBuffer[i].getData()[0]==0x0C)
2108 measure = rxBuffer[i].getData()[3]<<8 | rxBuffer[i].getData()[4];
2113 error = long(measure) - long(middle_val);
2127 if (serial_no == NULL)
return -1;
2129 memset (serial_no,0,8);
2132 if (m_idriver == NULL)
2134 if(_verbose) yError (
"Driver not ready\n");
2141 (
board_list[i].type==icubCanProto_boardType__strain) || (
board_list[i].type==icubCanProto_boardType__strain2))
2152#define EOCANPROT_D_CREATE_CANID(clss, orig, dest) ( (((clss)&0xF) << 8) | (((orig)&0xF) << 4) | ((dest)&0xF) )
2164 if(NULL == m_idriver)
2166 if(_verbose) yError (
"cDownloader::get_firmware_version(): driver not ready\n");
2170 int read_messages = 0;
2173 info->type = boardtype;
2174 info->firmware.major = info->firmware.minor = info->firmware.build = 0;
2175 info->protocol.major = info->protocol.minor = 0;
2177 txBuffer[0].setLen(3);
2178 txBuffer[0].getData()[0] = 0;
2179 txBuffer[0].getData()[1] = 0;
2180 txBuffer[0].getData()[2] = 0;
2186 bool boardisMC =
false;
2189 case eobrd_cantype_dsp:
2190 case eobrd_cantype_mc4:
2191 case eobrd_cantype_2dc:
2192 case eobrd_cantype_bll:
2193 case eobrd_cantype_foc:
2197 txBuffer[0].getData()[0] = ICUBCANPROTO_POL_MC_CMD__GET_FIRMWARE_VERSION;
2200 case eobrd_cantype_mtb:
2201 case eobrd_cantype_strain:
2202 case eobrd_cantype_mais:
2203 case eobrd_cantype_6sg:
2204 case eobrd_cantype_mtb4:
2205 case eobrd_cantype_strain2:
2206 case eobrd_cantype_rfe:
2207 case eobrd_cantype_sg3:
2208 case eobrd_cantype_psc:
2209 case eobrd_cantype_mtb4w:
2210 case eobrd_cantype_pmc:
2211 case eobrd_cantype_amcbldc:
2212 case eobrd_cantype_mtb4c:
2213 case eobrd_cantype_strain2c:
2217 txBuffer[0].getData()[0] = ICUBCANPROTO_POL_AS_CMD__GET_FW_VERSION;
2222 if(_verbose) yError (
"cDownloader::get_firmware_version(): this board %d is not supported. returning all zeros\n", boardtype);
2228 set_bus(txBuffer[0], bus);
2232 if(_verbose) yError (
"Unable to send message\n");
2238 if(0 == read_messages)
2245 for (
int i=0; i<read_messages; i++)
2249 if (rxBuffer[i].getData()[0]==ICUBCANPROTO_BL_GET_ADDITIONAL_INFO)
2251 fprintf(stderr,
"%.4x ", rxBuffer[i].getId());
2252 fprintf(stderr,
"%.2x ", rxBuffer[i].getData()[0]);
2253 fprintf(stderr,
"%.2x ", rxBuffer[i].getData()[1]);
2254 fprintf(stderr,
"%.2x ", rxBuffer[i].getData()[2]);
2255 fprintf(stderr,
"%.2x ", rxBuffer[i].getData()[3]);
2256 fprintf(stderr,
"%.2x ", rxBuffer[i].getData()[4]);
2257 fprintf(stderr,
"%.2x ", rxBuffer[i].getData()[5]);
2258 fprintf(stderr,
"%.2x ", rxBuffer[i].getData()[6]);
2259 fprintf(stderr,
"%.2x\n", rxBuffer[i].getData()[7]);
2263 if ((txBuffer[0].getData()[0] == rxBuffer[i].getData()[0]) && (8 == rxBuffer[i].getLen()))
2265 info->type = rxBuffer[i].getData()[1];
2266 info->firmware.major = rxBuffer[i].getData()[2];
2267 info->firmware.minor = rxBuffer[i].getData()[3];
2268 info->firmware.build = rxBuffer[i].getData()[4];
2269 info->protocol.major = rxBuffer[i].getData()[5];
2270 info->protocol.minor = rxBuffer[i].getData()[6];
2274 yWarning() <<
"unknown message";
2285 if (board_info == NULL)
return -1;
2287 memset (board_info,0x3f,32);
2290 if (m_idriver == NULL)
2292 if(_verbose) yError (
"Driver not ready\n");
2297 int read_messages = 0;
2300 txBuffer[0].setId(build_id(
ID_MASTER, target_id));
2301 txBuffer[0].setLen(1);
2302 txBuffer[0].getData()[0]= ICUBCANPROTO_BL_GET_ADDITIONAL_INFO;
2303 set_bus(txBuffer[0], bus);
2309 if(_verbose) yError (
"Unable to send message\n");
2324 for (j=0; j<31; j++) board_info[j]=0;
2327 for (i=0; i<read_messages; i++)
2331 if (rxBuffer[i].getData()[0]==ICUBCANPROTO_BL_GET_ADDITIONAL_INFO)
2333 fprintf(stderr,
"%.4x ", rxBuffer[i].getId());
2334 fprintf(stderr,
"%.2x ", rxBuffer[i].getData()[0]);
2335 fprintf(stderr,
"%.2x ", rxBuffer[i].getData()[1]);
2336 fprintf(stderr,
"%.2x ", rxBuffer[i].getData()[2]);
2337 fprintf(stderr,
"%.2x ", rxBuffer[i].getData()[3]);
2338 fprintf(stderr,
"%.2x ", rxBuffer[i].getData()[4]);
2339 fprintf(stderr,
"%.2x ", rxBuffer[i].getData()[5]);
2340 fprintf(stderr,
"%.2x ", rxBuffer[i].getData()[6]);
2341 fprintf(stderr,
"%.2x\n", rxBuffer[i].getData()[7]);
2345 if (rxBuffer[i].getData()[0]==ICUBCANPROTO_BL_GET_ADDITIONAL_INFO && rxBuffer[i].getLen()==6)
2347 int part = rxBuffer[i].getData()[1];
2348 for (j = 0; j< 4; j++)
2351 board_info[tmp]=rxBuffer[i].getData()[j+2];
2368 if (m_idriver == NULL)
2370 if(_verbose) yError (
"Driver not ready\n");
2379 for (counter = 0 ; counter < 8; counter++)
2384 txBuffer[0].getData()[0]= ICUBCANPROTO_BL_SET_ADDITIONAL_INFO;
2385 txBuffer[0].getData()[1]= counter;
2386 txBuffer[0].setId(build_id(
ID_MASTER, target_id));
2387 txBuffer[0].setLen(6);
2390 txBuffer[0].getData()[2+j] = board_info[j+counter*4];
2392 set_bus(txBuffer[0], bus);
2400 if(_verbose) yError (
"Unable to send message\n");
2419 if (m_idriver == NULL)
2421 if(_verbose) yError (
"Driver not ready\n");
2427 case icubCanProto_boardType__strain:
2428 case icubCanProto_boardType__skin:
2429 case icubCanProto_boardType__mais:
2430 case icubCanProto_boardType__6sg:
2431 case icubCanProto_boardType__mtb4:
2432 case icubCanProto_boardType__strain2:
2433 case icubCanProto_boardType__rfe:
2434 case icubCanProto_boardType__sg3:
2435 case icubCanProto_boardType__psc:
2436 case icubCanProto_boardType__mtb4w:
2437 case icubCanProto_boardType__mtb4c:
2438 case eobrd_cantype_pmc:
2439 case eobrd_cantype_amcbldc:
2440 case eobrd_cantype_strain2c:
2442 txBuffer[0].setId((0x02 << 8) + (
ID_MASTER << 4) + target_id);
2443 txBuffer[0].setLen(2);
2444 txBuffer[0].getData()[0]= ICUBCANPROTO_POL_MC_CMD__SET_BOARD_ID;
2445 txBuffer[0].getData()[1]= new_id;
2448 case icubCanProto_boardType__dsp:
2449 case icubCanProto_boardType__pic:
2450 case icubCanProto_boardType__2dc:
2451 case icubCanProto_boardType__4dc:
2452 case icubCanProto_boardType__bll:
2453 case icubCanProto_boardType__2foc:
2454 case icubCanProto_boardType__jog:
2455 txBuffer[0].setId((
ID_MASTER << 4) + target_id);
2456 txBuffer[0].setLen(2);
2457 txBuffer[0].getData()[0]= ICUBCANPROTO_POL_MC_CMD__SET_BOARD_ID;
2458 txBuffer[0].getData()[1]= new_id;
2462 if(_verbose) yError (
"Unknown board type for change of CAN address\n");
2467 set_bus(txBuffer[0], bus);
2473 if(_verbose) yError (
"Unable to send message\n");
2490 if (m_idriver == NULL)
2492 if(_verbose) yError (
"Driver not ready\n");
2500#if defined(DOWNLOADER_ETH_SUPPORTS_MULTIBUS)
2507 if(_verbose) yDebug(
"working on every CAN bus");
2512 txBuffer[0].setLen(1);
2513 txBuffer[0].getData()[0]= ICUBCANPROTO_BL_BROADCAST;
2522 txBuffer[0].setLen(1);
2523 txBuffer[0].getData()[0]= ICUBCANPROTO_BL_BROADCAST;
2531 if(_verbose) yDebug(
"Discovery on every CAN bus is not allowed: reverting to bus CAN1");
2539 txBuffer[0].setLen(1);
2540 txBuffer[0].getData()[0]= ICUBCANPROTO_BL_BROADCAST;
2548 if(_verbose) yError (
"Unable to send message\n");
2557 int read_messages=0;
2562 if (read_messages==0)
2564 if(_verbose) yError (
"No answers\n");
2571 for (i=0; i<read_messages; i++)
2576 fprintf(stderr,
"CAN%d:%.2x, l=%d", get_bus(rxBuffer[i]), rxBuffer[i].getId(), rxBuffer[i].getLen());
2577 fprintf(stderr,
"d[0] %.2x ", rxBuffer[i].getData()[0]);
2578 fprintf(stderr,
"d[1] %.2x ", rxBuffer[i].getData()[1]);
2579 fprintf(stderr,
"d[2] %.2x ", rxBuffer[i].getData()[2]);
2580 fprintf(stderr,
"d[3] %.2x ", rxBuffer[i].getData()[3]);
2581 fprintf(stderr,
"d[4] %.2x ", rxBuffer[i].getData()[4]);
2582 fprintf(stderr,
"d[5] %.2x ", rxBuffer[i].getData()[5]);
2583 fprintf(stderr,
"d[6] %.2x ", rxBuffer[i].getData()[6]);
2584 fprintf(stderr,
"d[7] %.2x\n", rxBuffer[i].getData()[7]);
2587 if ((rxBuffer[i].getData()[0]==ICUBCANPROTO_BL_BROADCAST) &&
2588 ((rxBuffer[i].getLen()==4)||(rxBuffer[i].getLen()==5)))
2600 if(_verbose) yError (
"No Boards found\n");
2619 for (i=0; i<read_messages; i++)
2621 if ((rxBuffer[i].getData()[0]==ICUBCANPROTO_BL_BROADCAST) &&
2622 ((rxBuffer[i].getLen()==4)||(rxBuffer[i].getLen()==5)))
2624#if defined(DOWNLOADER_USE_IDRIVER2)
2634 if (rxBuffer[i].getLen()==4)
2651 char board_info [32];
2663 char serial_no [32];
2677 if(
board_list[i].type==icubCanProto_boardType__strain)
2681 else if(
board_list[i].type==icubCanProto_boardType__strain2 ||
board_list[i].type==icubCanProto_boardType__strain2c)
2690#define TEST_GET_FW_VERSION
2692#if defined(TEST_GET_FW_VERSION)
2694 if(_verbose) yDebug (
"about to ask fw version \n");
2701 eObrd_info_t info = {0};
2702 memset(&info, 0,
sizeof(info));
2703 bool noreply =
true;
2707 fprintf(stderr,
"board %d: ret = %d, reply = %d, type = %d, f=(%d, %d, %d), pr=(%d, %d)\n", i, rr, !noreply,
2709 info.firmware.major, info.firmware.minor, info.firmware.build,
2710 info.protocol.major, info.protocol.minor);
2720 if(_verbose) yDebug(
" BUS:id type version");
2746 if (m_idriver == NULL)
2748 if(_verbose) yError (
"START_CMD: Driver not ready\n");
2754 case icubCanProto_boardType__dsp:
2755 case icubCanProto_boardType__pic:
2756 case icubCanProto_boardType__2dc:
2757 case icubCanProto_boardType__4dc:
2758 case icubCanProto_boardType__bll:
2761 txBuffer[0].setId(build_id(
ID_MASTER, board_pid));
2762 txBuffer[0].setLen(1);
2763 txBuffer[0].getData()[0]= ICUBCANPROTO_BL_BOARD;
2766 set_bus(txBuffer[0], bus);
2771 case icubCanProto_boardType__skin:
2772 case icubCanProto_boardType__strain:
2773 case icubCanProto_boardType__mais:
2774 case icubCanProto_boardType__2foc:
2775 case icubCanProto_boardType__6sg:
2776 case icubCanProto_boardType__jog:
2777 case icubCanProto_boardType__mtb4:
2778 case icubCanProto_boardType__strain2:
2779 case icubCanProto_boardType__rfe:
2780 case icubCanProto_boardType__sg3:
2781 case icubCanProto_boardType__psc:
2782 case icubCanProto_boardType__mtb4w:
2783 case icubCanProto_boardType__mtb4c:
2784 case eobrd_cantype_pmc:
2785 case eobrd_cantype_amcbldc:
2786 case eobrd_cantype_strain2c:
2787 case icubCanProto_boardType__unknown:
2790 txBuffer[0].setId(build_id(
ID_MASTER,board_pid));
2791 txBuffer[0].setLen(2);
2792 txBuffer[0].getData()[0]= ICUBCANPROTO_BL_BOARD;
2793 txBuffer[0].getData()[1]= (int) board_eeprom;
2796 set_bus(txBuffer[0], bus);
2802 set_bus(txBuffer[0], bus);
2808 if(_verbose) yError (
"START_CMD: Unable to send message\n");
2819 for (
int i=0; i<read_messages; i++)
2821 if (rxBuffer[i].getData()[0]==ICUBCANPROTO_BL_BOARD &&
2822 (((rxBuffer[i].getId() >> 4) & 0x0F) == board_pid) &&
2823 (((rxBuffer[i].getId() >> 8) & 0x07) == ICUBCANPROTO_CLASS_BOOTLOADER))
2833 if(_verbose) yError (
"START_CMD: No ACK received from board %d\n", board_pid);
2843 if (m_idriver == NULL)
2845 if(_verbose) yError (
"STOP_CMD: Driver not ready\n");
2850 txBuffer[0].setId(build_id(
ID_MASTER, board_pid));
2851 txBuffer[0].setLen(1);
2852 txBuffer[0].getData()[0]= ICUBCANPROTO_BL_END;
2853 set_bus(txBuffer[0], bus);
2859 if(_verbose) yError (
"STOP_CMD: Unable to send message\n");
2870 for (
int i=0; i<read_messages; i++)
2872 if (rxBuffer[i].getData()[0]==ICUBCANPROTO_BL_END &&
2873 (((rxBuffer[i].getId() >> 4) & 0x0F) == board_pid || board_pid == 15 ) &&
2874 (((rxBuffer[i].getId() >> 8) & 0x07) == ICUBCANPROTO_CLASS_BOOTLOADER))
2883 if(_verbose) yError (
"TOP_CMD: No ACK received from board %d\n", board_pid);
2891 char hexconv_buffer[5];
2892 memset (hexconv_buffer,
'\0',
sizeof(hexconv_buffer) );
2893 strncpy(hexconv_buffer,line,len);
2894 return axtoi (hexconv_buffer);
2898int cDownloader::verify_ack(
int command,
int read_messages)
2922 for (k=0; k<read_messages; k++)
2924 if ((rxBuffer[k].getData()[0]==command) &&
2925 (rxBuffer[k].getLen() == 2) &&
2926 (rxBuffer[k].getData()[1]==1))
2928 if(
board_list[i].pid == get_src_from_id(rxBuffer[k].getId()))
2930 #if defined(DOWNLOADER_USE_IDRIVER2)
2931 if(
board_list[i].bus == rxBuffer[k].getCanBus())
2963int cDownloader::download_motorola_line(
char* line,
int len,
int bus,
int board_pid)
2974 char sprsRecordType=0;
2975 unsigned long int sprsChecksum=0;
2976 int sprsMemoryType=1;
2977 long unsigned int sprsAddress;
2981 int read_messages=0;
2983 for (i=2; i<len; i=i+2)
2986 sprsChecksum+= value;
2991 if ((sprsChecksum & 0xFF) == 0xFF)
2997 if(_verbose) yError (
"Failed Checksum\n");
3002 if (!(line[0] ==
'S'))
3004 if(_verbose) yError (
"start tag character not found\n");
3010 sprsRecordType=char(*(line+i));
3017 switch (sprsRecordType)
3029 if (sprsAddress==0x0020)
3038 txBuffer[0].setId(build_id(
ID_MASTER,board_pid));
3039 txBuffer[0].setLen(5);
3040 txBuffer[0].getData()[0]= ICUBCANPROTO_BL_ADDRESS;
3041 txBuffer[0].getData()[1]= sprsLength;
3042 txBuffer[0].getData()[2]= (
unsigned char) ((sprsAddress) & 0x00FF);
3043 txBuffer[0].getData()[3]= (
unsigned char) ((sprsAddress>>8) & 0x00FF);
3044 txBuffer[0].getData()[4]= sprsMemoryType;
3047 set_bus(txBuffer[0], bus);
3053 if(_verbose) yError (
"Unable to send message\n");
3062 if ((sprsLength%6) == 0)
3069 tmp=sprsLength / 6 + 1;
3070 rest=sprsLength % 6;
3073 for (j=1; j<=
tmp; j++)
3075 txBuffer[0].getData()[0]=ICUBCANPROTO_BL_DATA;
3076 if (j<tmp) txBuffer[0].setLen(7);
3077 else txBuffer[0].setLen(rest+1);
3079 for (k=1; k<=6; k++)
3081 txBuffer[0].getData()[k] =
getvalue(line+i+((k-1)*2+((j-1)*12)),2);
3085 set_bus(txBuffer[0], bus);
3091 if(_verbose) yError (
"Unable to send message\n");
3104 passed=Time::now()-now;
3115 txBuffer[0].setId(build_id(
ID_MASTER,board_pid));
3116 txBuffer[0].setLen(5);
3117 txBuffer[0].getData()[0]= ICUBCANPROTO_BL_START;
3118 txBuffer[0].getData()[4]=
getvalue(line+i,2); i+=2;
3119 txBuffer[0].getData()[3]=
getvalue(line+i,2); i+=2;
3120 txBuffer[0].getData()[2]=
getvalue(line+i,2); i+=2;
3121 txBuffer[0].getData()[1]=
getvalue(line+i,2);
3124 set_bus(txBuffer[0], bus);
3130 if(_verbose) yError (
"Unable to send message\n");
3139 verify_ack(ICUBCANPROTO_BL_START, read_messages);
3146 if(_verbose) yError (
"wrong format tag character %c (hex:%X)\n", sprsRecordType, sprsRecordType);
3152 if(_verbose) yError (
"Can't reach here!\n");
3163int cDownloader::download_hexintel_line(
char* line,
int len,
int bus,
int board_pid,
bool eeprom,
int board_type)
3165 char sprsRecordType=0;
3166 unsigned int sprsState;
3167 unsigned long int sprsChecksum=0;
3168 int sprsMemoryType=0;
3169 long unsigned int sprsAddress=0;
3171 unsigned int sprsData[50];
3174 int read_messages=0;
3176 for (i=1; i<len; i=i+2)
3179 sprsChecksum+= value;
3182 sprsChecksum = (sprsChecksum & 0xFF);
3183 if (sprsChecksum == 0x00)
3189 if(_verbose) yError (
"Failed Checksum\n");
3201 if (!(line[0] ==
':'))
3203 if(_verbose) yError(
"start tag character not found in hex file\n");
3214 sprsRecordType=char(*(line+i+1));
3235 switch (sprsRecordType)
3239 for (k=0;k<sprsLength;k++)
3261 if((icubCanProto_boardType__mtb4 == board_type) || (icubCanProto_boardType__strain2 == board_type) ||
3262 (icubCanProto_boardType__rfe == board_type) || (icubCanProto_boardType__sg3 == board_type) ||
3263 (icubCanProto_boardType__psc == board_type) || (icubCanProto_boardType__mtb4w == board_type) ||
3264 (icubCanProto_boardType__pmc == board_type)
3265 || (icubCanProto_boardType__amcbldc == board_type)
3266 || (icubCanProto_boardType__mtb4c == board_type)
3267 || (icubCanProto_boardType__strain2c == board_type)
3276 snprintf(msg,
sizeof(msg),
"0x%04X",
sprsPage);
3277 yError() <<
"Upload of FW to board" << eoboards_type2string2((eObrd_type_t)board_type, eobool_true) <<
"is aborted because it was detected a wrong page number =" << msg <<
"in the .hex file";
3278 yError() <<
"You must have loaded the .hex file of another board. Perform a new discovery, check the file name and retry.";
3292 if (sprsChecksum==0)
3294 switch (sprsRecordType)
3301 txBuffer[0].setId(build_id(
ID_MASTER,board_pid));
3302 txBuffer[0].setLen(7);
3303 txBuffer[0].getData()[0]= ICUBCANPROTO_BL_ADDRESS;
3304 txBuffer[0].getData()[1]= sprsLength;
3305 txBuffer[0].getData()[2]= (
unsigned char) ((sprsAddress) & 0x00FF);
3306 txBuffer[0].getData()[3]= (
unsigned char) ((sprsAddress>>8) & 0x00FF);
3307 txBuffer[0].getData()[4]= sprsMemoryType;
3308 txBuffer[0].getData()[5]= (
unsigned char) ((
sprsPage) & 0x00FF);
3309 txBuffer[0].getData()[6]= (
unsigned char) ((
sprsPage >>8) & 0x00FF);
3312 set_bus(txBuffer[0], bus);
3319 if(_verbose) yError (
"Unable to send message\n");
3327 if ((sprsLength%6) == 0)
3334 tmp=sprsLength / 6 + 1;
3335 rest=sprsLength % 6;
3338 for (j=1; j<=
tmp; j++)
3340 txBuffer[0].getData()[0]=ICUBCANPROTO_BL_DATA;
3341 if (j<tmp) txBuffer[0].setLen(7);
3342 else txBuffer[0].setLen(rest+1);
3344 for (k=1; k<=6; k++)
3346 txBuffer[0].getData()[k] = sprsData[(k-1)+((j-1)*6)];
3350 set_bus(txBuffer[0], bus);
3356 if(_verbose) yError (
"Unable to send message\n");
3364 ret=verify_ack(ICUBCANPROTO_BL_DATA, read_messages);
3374 txBuffer[0].setId(build_id(
ID_MASTER,board_pid));
3375 txBuffer[0].setLen(5);
3376 txBuffer[0].getData()[0]= ICUBCANPROTO_BL_START;
3377 txBuffer[0].getData()[1]= 0;
3378 txBuffer[0].getData()[2]= 0;
3379 txBuffer[0].getData()[3]= 0;
3380 txBuffer[0].getData()[4]= 0;
3383 set_bus(txBuffer[0], bus);
3388 if(_verbose) yError (
"Unable to send message\n");
3395 ret=verify_ack(ICUBCANPROTO_BL_START, read_messages);
3410 if(_verbose) yError (
"Checksum Error\n");
3417 if(_verbose) yError (
"Can't reach here!\n");
3430 if(_verbose) yError (
"Error opening file!\n");
3448 if(_verbose) yError (
"Error opening file!\n");
3465 if(_verbose) yError (
"File not open!\n");
3485 if (strlen(buffer)!=0)
3487 switch (download_type)
3489 case icubCanProto_boardType__dsp:
3490 case icubCanProto_boardType__2dc:
3491 case icubCanProto_boardType__4dc:
3492 case icubCanProto_boardType__bll:
3493 ret = download_motorola_line(buffer, strlen(buffer), bus, board_pid);
3495 case icubCanProto_boardType__pic:
3496 case icubCanProto_boardType__skin:
3497 case icubCanProto_boardType__strain:
3498 case icubCanProto_boardType__mais:
3499 case icubCanProto_boardType__2foc:
3500 case icubCanProto_boardType__jog:
3501 case icubCanProto_boardType__6sg:
3502 case icubCanProto_boardType__mtb4:
3503 case icubCanProto_boardType__strain2:
3504 case icubCanProto_boardType__rfe:
3505 case icubCanProto_boardType__sg3:
3506 case icubCanProto_boardType__psc:
3507 case icubCanProto_boardType__mtb4w:
3508 case icubCanProto_boardType__mtb4c:
3509 case icubCanProto_boardType__pmc:
3510 case icubCanProto_boardType__amcbldc:
3511 case icubCanProto_boardType__strain2c:
3512 ret = download_hexintel_line(buffer, strlen(buffer), bus, board_pid, board_eeprom, download_type);
3515 case icubCanProto_boardType__unknown:
3522 if(_verbose) yError(
"fatal error during download: abort\n");
3542void cDownloader::clean_rx(
void)
3547#if defined(DOWNLOADER_USE_IDRIVER2)
3549void cDownloader::set_bus(
CanPacket &pkt,
int bus)
3561void cDownloader::set_bus(yarp::dev::CanMessage &msg,
int bus)
3566int cDownloader::get_bus(yarp::dev::CanMessage &msg)
3575int cDownloader::strain_calibrate_offset2_strain1 (
int bus,
int target_id, int16_t t,
string *errorstring)
3578 return strain_calibrate_offset2_strain1safer(bus, target_id, t, 2,
false, errorstring);
3581 if (m_idriver == NULL)
3583 if(_verbose) yError (
"Driver not ready\n");
3588 unsigned int middle_val = 32768 + t;
3591 const int regset = 0;
3593 int daclimit = 0x3ff;
3601 unsigned int measure = 0;
3602 unsigned int dac = 0;
3606 for (channel=0; channel<6; channel++)
3610 txBuffer[0].setId((2 << 8) + target_id);
3611 txBuffer[0].setLen(3);
3612 txBuffer[0].getData()[0]= 0x0C;
3613 txBuffer[0].getData()[1]= channel;
3614 txBuffer[0].getData()[2]= 0;
3615 set_bus(txBuffer[0], bus);
3620 if(_verbose) yError (
"Unable to send message\n");
3625 for (i=0; i<read_messages; i++)
3627 if (rxBuffer[i].getData()[0]==0x0C)
3629 measure = rxBuffer[i].getData()[3]<<8 | rxBuffer[i].getData()[4];
3636 txBuffer[0].setId((2 << 8) + target_id);
3637 txBuffer[0].setLen(2);
3638 txBuffer[0].getData()[0]= 0x0B;
3639 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (channel & 0x0f);
3640 txBuffer[0].getData()[1]= (channel & 0x0f);
3641 set_bus(txBuffer[0], bus);
3645 for (i=0; i<read_messages; i++)
3647 if (rxBuffer[i].getData()[0]==0x0B)
3649 dac = rxBuffer[i].getData()[2]<<8 | rxBuffer[i].getData()[3];
3654 error = long(measure) - long(middle_val);
3659 if (
error>0) dac -= dacstep;
3660 else dac += dacstep;
3662 if (dac>daclimit) dac = daclimit;
3668 txBuffer[0].setId((2 << 8) + target_id);
3669 txBuffer[0].setLen(4);
3670 txBuffer[0].getData()[0]= 0x04;
3671 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (channel & 0x0f);
3672 txBuffer[0].getData()[2]= dac >> 8;
3673 txBuffer[0].getData()[3]= dac & 0xFF;
3674 set_bus(txBuffer[0], bus);
3681 txBuffer[0].setId((2 << 8) + target_id);
3682 txBuffer[0].setLen(3);
3683 txBuffer[0].getData()[0]= 0x0C;
3684 txBuffer[0].getData()[1]= channel;
3685 txBuffer[0].getData()[2]= 0;
3686 set_bus(txBuffer[0], bus);
3691 if(_verbose) yError (
"Unable to send message\n");
3696 for (i=0; i<read_messages; i++)
3698 if (rxBuffer[i].getData()[0]==0x0C)
3700 measure = rxBuffer[i].getData()[3]<<8 | rxBuffer[i].getData()[4];
3705 error = long(measure) - long(middle_val);
3716int cDownloader::strain_calibrate_offset2_strain2(
int bus,
int target_id,
const std::vector<strain2_ampl_discretegain_t> &gains,
const std::vector<int16_t> &targets,
string *errorstring)
3720 const unsigned int NUMofCHANNELS = 6;
3722 std::ostringstream ss;
3725 if (m_idriver == NULL)
3727 if(_verbose) yError (
"Driver not ready\n");
3728 Log(std::string(
"strain_calibrate_offset2_strain2(): failure. driver no ready"));
3735 ss <<
"performing offset autotuning for strain2";
3739 for(
int channel=0; channel<NUMofCHANNELS; channel++)
3750 Log(
"strain_calibrate_offset2_strain2(): failure of strain_set_amplifier_discretegain()");
3755 yarp::os::Time::delay(1.0);
3758 uint16_t ooffset = 0;
3761 ss <<
" and read (g, o) = (" << std::to_string(
static_cast<int>(gaain)) <<
", " << std::to_string(ooffset) <<
")";
3767 yarp::os::Time::delay(2.0);
3773 int16_t singletargetVALUE = targets[0];
3774 bool singletargetTHEREIS =
true;
3775 for(
int channel=1; channel<NUMofCHANNELS; channel++)
3777 if(singletargetVALUE != targets[channel])
3779 singletargetTHEREIS =
false;
3790 uint8_t samples2average = 8;
3795 const uint8_t everychannel = 0x0f;
3797 uint8_t channel2autocalib = everychannel;
3798 unsigned int middle_val = 32768;
3799 uint8_t okmask = 0x3f;
3801 if(
true == singletargetTHEREIS)
3804 channel2autocalib = everychannel;
3805 middle_val = 32768 + singletargetVALUE;
3811 ss <<
"STEP-2. there is a single ADC target: performing parallel regularization";
3816 ss <<
" params: target = " << std::to_string(singletargetVALUE) <<
" tolerance = " << std::to_string(
tolerance) <<
" samples2average = " << std::to_string(samples2average);
3819 txBuffer[0].setId((2 << 8) + target_id);
3820 txBuffer[0].setLen(8);
3821 txBuffer[0].getData()[0]= 0x22;
3822 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (channel2autocalib & 0x0f);
3823 txBuffer[0].getData()[2]= 0;
3824 txBuffer[0].getData()[3]= middle_val & 0x00ff;
3825 txBuffer[0].getData()[4]= (middle_val >> 8) & 0x00ff;
3826 txBuffer[0].getData()[5]=
tolerance & 0x00ff;
3827 txBuffer[0].getData()[6]= (
tolerance >> 8) & 0x00ff;
3828 txBuffer[0].getData()[7]= samples2average;
3829 set_bus(txBuffer[0], bus);
3835 if(_verbose) yError (
"Unable to send message\n");
3844 ss <<
"STEP-3. results ...";
3848 for(
int i=0; i<read_messages; i++)
3850 if (rxBuffer[i].getData()[0]==0x22)
3855 uint8_t noisychannelmask = rxBuffer[i].getData()[2];
3856 uint8_t algorithmOKmask = rxBuffer[i].getData()[3];
3857 uint8_t finalmeasureOKmask = rxBuffer[i].getData()[4];
3858 uint16_t mae = (
static_cast<uint32_t
>(rxBuffer[i].getData()[6])) |
3859 (
static_cast<uint32_t
>(rxBuffer[i].getData()[7]) << 8);
3861 if((okmask == algorithmOKmask) && (okmask == finalmeasureOKmask))
3865 ss <<
" OK w/ MAE = " << std::to_string(mae);
3868 if(0 != noisychannelmask)
3872 ss <<
" BUT noisy acquisition of samples: ";
3873 if((0x40 & noisychannelmask) == 0x40)
3875 ss <<
" in computing average ADC before algorithm ";
3877 if((0x80 & noisychannelmask) == 0x80)
3879 ss <<
"after algorithm in computing MAE";
3885 char tmp[256] = {0};
3886 snprintf(tmp,
sizeof(tmp),
"noisychannelmask = 0x%x, algorithmOKmask = 0x%x, finalmeasureOKmask = 0x%x, mae = %d", noisychannelmask, algorithmOKmask, finalmeasureOKmask, mae);
3887 ss <<
"COMPLETE RES: " <<
tmp;
3897 char tmp[256] = {0};
3898 snprintf(tmp,
sizeof(tmp),
"noisychannelmask = 0x%x, algorithmOKmask = 0x%x, finalmeasureOKmask = 0x%x, mae = %d", noisychannelmask, algorithmOKmask, finalmeasureOKmask, mae);
3902 if(0 != noisychannelmask)
3906 ss <<
" WITH noisy acquisition of samples: ";
3907 if((0x40 & noisychannelmask) == 0x40)
3909 ss <<
" in computing average ADC before algorithm ";
3911 if((0x80 & noisychannelmask) == 0x80)
3913 ss <<
"after algorithm in computing MAE";
3918 for(uint8_t channel=0; channel<NUMofCHANNELS; channel++)
3922 bool problems =
false;
3923 ss <<
"- on ch " << std::to_string(channel) <<
":";
3924 if((algorithmOKmask & (0x01<<channel)) == 0)
3927 ss <<
" [algorithm fails]";
3929 if((finalmeasureOKmask & (0x01<<channel)) == 0)
3932 ss <<
" [mae is high (does ADC work?)]";
3934 if(((noisychannelmask) & (0x01<<channel)) == (0x01<<channel))
3937 ss <<
" [noisy acquition]";
3941 ss <<
" [no detected problem]";
3955 ss <<
"STEP-2. there are multiple ADC targets: performing regularization channel by channel";
3960 ss <<
" common params: tolerance = " << std::to_string(
tolerance) <<
" samples2average = " << std::to_string(samples2average);
3964 for(
int channel=0; channel<NUMofCHANNELS; channel++)
3966 channel2autocalib = channel;
3967 middle_val = 32768 + targets[channel];
3968 okmask = 0x01 << channel;
3972 ss <<
"- on ch " << std::to_string(channel) <<
": ADC target = " << std::to_string(targets[channel]);
3979 txBuffer[0].setId((2 << 8) + target_id);
3980 txBuffer[0].setLen(8);
3981 txBuffer[0].getData()[0]= 0x22;
3982 txBuffer[0].getData()[1]= ((regset << 4) & 0xf0) | (channel2autocalib & 0x0f);
3983 txBuffer[0].getData()[2]= 0;
3984 txBuffer[0].getData()[3]= middle_val & 0x00ff;
3985 txBuffer[0].getData()[4]= (middle_val >> 8) & 0x00ff;
3986 txBuffer[0].getData()[5]=
tolerance & 0x00ff;
3987 txBuffer[0].getData()[6]= (
tolerance >> 8) & 0x00ff;
3988 txBuffer[0].getData()[7]= samples2average;
3989 set_bus(txBuffer[0], bus);
3994 if(_verbose) yError (
"Unable to send message\n");
4003 for(
int i=0; i<read_messages; i++)
4005 if (rxBuffer[i].getData()[0]==0x22)
4010 uint8_t noisychannelmask = rxBuffer[i].getData()[2];
4011 uint8_t algorithmOKmask = rxBuffer[i].getData()[3];
4012 uint8_t finalmeasureOKmask = rxBuffer[i].getData()[4];
4013 uint16_t mae = (
static_cast<uint32_t
>(rxBuffer[i].getData()[6])) |
4014 (
static_cast<uint32_t
>(rxBuffer[i].getData()[7]) << 8);
4016 if((okmask == algorithmOKmask) && (okmask == finalmeasureOKmask))
4020 ss <<
" OK w/ MAE = " << std::to_string(mae);
4023 if(0 != (noisychannelmask & okmask))
4027 ss <<
" BUT noisy acquisition of samples: ";
4030 if((0x40 & noisychannelmask) == 0x40)
4034 ss <<
" - in computing average ADC before algorithm ";
4037 if((0x80 & noisychannelmask) == 0x80)
4041 ss <<
" - after algorithm in computing MAE";
4047 char tmp[256] = {0};
4048 snprintf(tmp,
sizeof(tmp),
"noisychannelmask = 0x%x, algorithmOKmask = 0x%x, finalmeasureOKmask = 0x%x, mae = %d", noisychannelmask, algorithmOKmask, finalmeasureOKmask, mae);
4049 ss <<
"COMPLETE RES: " <<
tmp;
4059 ss <<
" KO /w MAE = " << std::to_string(mae) <<
" because: ";
4064 char tmp[256] = {0};
4065 snprintf(tmp,
sizeof(tmp),
" KO details: noisychannelmask = 0x%x, algorithmOKmask = 0x%x, finalmeasureOKmask = 0x%x, mae = %d", noisychannelmask, algorithmOKmask, finalmeasureOKmask, mae);
4069 bool problems =
false;
4070 if((algorithmOKmask & okmask) == 0)
4075 ss <<
" - algorithm fails";
4078 if((finalmeasureOKmask & okmask) == 0)
4083 ss <<
" - mae is high (does ADC work?)";
4090 ss <<
" .. strange: no detected problem";
4104int cDownloader::readADC(
int bus,
int target_id,
int channel,
int nmeasures)
4108 txBuffer[0].setId((2 << 8) + target_id);
4109 txBuffer[0].setLen(3);
4110 txBuffer[0].getData()[0]= 0x0C;
4111 txBuffer[0].getData()[1]= channel;
4112 txBuffer[0].getData()[2]= type;
4116 for(
int n=0;
n<nmeasures;
n++)
4119 set_bus(txBuffer[0], bus);
4124 yError (
"Unable to send message\n");
4129 for (
int i=0; i<read_messages; i++)
4131 if (rxBuffer[i].getData()[0]==0x0C)
4133 tmp = (rxBuffer[i].getData()[3]<<8 | rxBuffer[i].getData()[4]);
4138 printf(
"cDownloader::strain_calibrate_offset2_strain1(): fails in reading reply for a measure\n");
4145 measure /= nmeasures;
4150int cDownloader::strain_calibrate_offset2_strain1safer (
int bus,
int target_id, int16_t t, uint8_t nmeasures,
bool fullsearch,
string *errorstring)
4153 if (m_idriver == NULL)
4155 if(_verbose) yError (
"Driver not ready\n");
4159 std::ostringstream ss;
4162 unsigned int middle_val = 32768 + t;
4171 ss <<
"performing offset autotuning for strain1 in full search mode";
4176 ss <<
"params: " <<
"adc target =" << std::to_string(t) <<
" using" << std::to_string(nmeasures) <<
"adc acquisions for better averaging";
4179 for(
int channel=0; channel<6; channel++)
4182 long minABSerror = 128*1024;
4183 unsigned int minDAC = 0;
4186 for(
unsigned int testdac=0; testdac<1024; testdac++)
4193 unsigned int tmp = 0;
4197 yError() <<
"failed to impose DAC = " << testdac <<
"read:" <<
tmp;
4201 int measure = readADC(bus, target_id, channel, nmeasures);
4203 long error = long(measure) - long(middle_val);
4205 if(fabs(
error) < fabs(minABSerror))
4207 minABSerror = fabs(
error);
4218 unsigned int tmp = 0;
4222 yError() <<
"failed to impose DAC = " << minDAC <<
"read:" <<
tmp;
4227 ss <<
"RESULT of FULL SEARCH w/ nsamples average =" << std::to_string(nmeasures) <<
"-> channel =" << std::to_string(channel) <<
"minerror = " << std::to_string(minABSerror) <<
"mindac =" << std::to_string(minDAC);
4237 const int daclimit = 0x3ff;
4238 const int dacstep = 1;
4240 const int maxiterations = 1024;
4244 ss <<
"performing gradient descend in dac space to find best value to match adc ="<< std::to_string(t) <<
" using" << std::to_string(nmeasures) <<
"adc acquisions for better averaging";
4249 ss <<
"exit conditions: max number of iterations =" << std::to_string(maxiterations) <<
"error tolerance =" << std::to_string(
tolerance);
4252 for(
int channel=0; channel<6; channel++)
4255 long minABSerror = 128*1024;
4256 unsigned int minDAC = 0;
4257 unsigned int dac = 0;
4260 int measure = readADC(bus, target_id, channel, nmeasures);
4265 long error = long(measure) - long(middle_val);
4268 minABSerror = fabs(
error);
4272 while ((abs(
error)>
tolerance) && (cycle<daclimit) && (cycle<maxiterations))
4274 if (
error>0) dac -= dacstep;
4275 else dac += dacstep;
4277 if (dac>daclimit) dac = daclimit;
4287 unsigned int tmp = 0;
4291 yError() <<
"failed to impose DAC = " << dac <<
"read:" <<
tmp;
4295 measure = readADC(bus, target_id, channel, nmeasures);
4297 error = long(measure) - long(middle_val);
4300 if(fabs(
error) < fabs(minABSerror))
4302 minABSerror = fabs(
error);
4309 ss <<
"RESULT of gradient descend w/ nsamples average =" << std::to_string(nmeasures) <<
" -> channel =" << std::to_string(channel) <<
" num iters =" << std::to_string(cycle) <<
" err = " << std::to_string(
error) <<
" applied dac =" << std::to_string(dac) <<
" minerror = " << std::to_string(minABSerror) <<
" mindac =" << std::to_string(minDAC);
4322 if (m_idriver == NULL)
4324 if (_verbose) yError(
"Driver not ready\n");
4329 for (
int attempt = 0; attempt < retries; ++attempt)
4331 txBuffer[0].setId(build_id(
ID_MASTER, canaddress));
4332 txBuffer[0].setLen(1);
4333 txBuffer[0].getData()[0] = ICUBCANPROTO_BL_BROADCAST;
4334 set_bus(txBuffer[0], canbus);
4339 if (_verbose) yError(
"Unable to send discovery message\n");
4347 for (
int i = 0; i < read_messages; ++i)
4349 yDebug(
"Received message ID: 0x%x, Data: [%x, %x, %x, %x, %x, %x, %x, %x]",
4350 rxBuffer[i].getId(),
4351 rxBuffer[i].getData()[0], rxBuffer[i].getData()[1], rxBuffer[i].getData()[2],
4352 rxBuffer[i].getData()[3], rxBuffer[i].getData()[4], rxBuffer[i].getData()[5],
4353 rxBuffer[i].getData()[6], rxBuffer[i].getData()[7]);
4356 for (
int i = 0; i < read_messages; ++i)
4358 if ((rxBuffer[i].getId() >> 4 & 0x0F) == canaddress)
4360 if (_verbose) yInfo(
"Board %d found on CAN bus %d\n", canaddress, canbus);
4371 current_board.
bus = canbus;
4372 current_board.
pid = canaddress;
4373 current_board.
type = rxBuffer[i].getData()[1];
4384 current_board.
eeprom =
false;
4386 current_board.
serial[0] =
'\0';
4394 if (_verbose) yError(
"Board %d not found on CAN bus %d after %d attempts\n", canaddress, canbus, retries);
constexpr double tolerance
void setCanBus(unsigned int bus)
int open_file(std::string file)
int strain_get_serial_number(int bus, int target_id, char *serial_number, string *errorstring=NULL)
int strain_set_matrix_gain(int bus, int target_id, unsigned int gain, int regset=strain_regset_inuse, string *errorstring=NULL)
int strain_acquire_start(int bus, int target_id, uint8_t txratemilli=20, bool calibmode=true, strain_acquisition_mode_t acqmode=strain_acquisition_mode_streaming, string *errorstring=NULL)
int strain_get_offset(int bus, int target_id, char channel, unsigned int &offset, int regset=strain_regset_inuse, string *errorstring=NULL)
int change_card_address(int bus, int target_id, int new_id, int board_type)
int strain_get_full_scale(int bus, int target_id, unsigned char channel, unsigned int &full_scale, int regset=strain_regset_inuse, string *errorstring=NULL)
int strain_get_calib_bias(int bus, int target_id, char channel, signed int &bias, int regset=strain_regset_inuse, string *errorstring=NULL)
int initSINGLEBOARD(int canbus, int canaddress)
int strain_reset_curr_bias(int bus, int target_id, string *errorstring=NULL)
int get_board_info(int bus, int target_id, char *board_info)
int strain_set_offset(int bus, int target_id, char channel, unsigned int offset, int regset=strain_regset_inuse, string *errorstring=NULL)
int startscheda(int bus, int board_pid, bool board_eeprom, int download_type)
int strain_set_serial_number(int bus, int target_id, const char *serial_number, string *errorstring=NULL)
int strain_acquire_stop(int bus, int target_id, strain_acquisition_mode_t acqmode=strain_acquisition_mode_streaming, string *errorstring=NULL)
int strain_set_amplifier_discretegain(int bus, int target_id, unsigned char channel, strain2_ampl_discretegain_t ampset, int regset=strain_regset_inuse, string *errorstring=NULL)
int strain_get_regulationset(int bus, int target_id, int ®set, const int regsetmode=strain_regsetmode_temporary, string *errorstring=NULL)
int stopscheda(int bus, int board_pid)
int strain_save_to_eeprom(int bus, int target_id, string *errorstring=NULL)
void set_verbose(bool verbose)
int strain_acquire_get(int bus, int target_id, vector< strain_value_t > &values, const unsigned int howmany=10, void(*updateProgressBar)(void *, float)=NULL, void *arg=NULL, strain_acquisition_mode_t acqmode=strain_acquisition_mode_streaming, const unsigned int maxerrors=1, string *errorstring=NULL)
int change_board_info(int bus, int target_id, char *board_info)
int strain_get_adc(int bus, int target_id, char channel, unsigned int &adc, int type, string *errorstring=NULL)
int strain_stop_sampling(int bus, int target_id, string *errorstring=NULL)
cDownloader(bool verbose=true)
strain_acquisition_mode_t
@ strain_acquisition_mode_polling
int initdriver(yarp::os::Searchable &config, bool verbose=true)
void set_canbus_id(int id)
int strain_get_eeprom_saved(int bus, int target_id, bool *status, string *errorstring=NULL)
int get_firmware_version(int bus, int target_id, eObrd_cantype_t boardtype, eObrd_info_t *info, bool &noreply)
int get_serial_no(int bus, int target_id, char *board_info)
int strain_reset_calib_bias(int bus, int target_id, string *errorstring=NULL)
int strain_get_matrix_gain(int bus, int target_id, unsigned int &gain, int regset=strain_regset_inuse, string *errorstring=NULL)
int strain_get_matrix_rc(int bus, int target_id, char r, char c, unsigned int &elem, int regset=strain_regset_inuse, string *errorstring=NULL)
void set_external_logger(void *caller=NULL, void(*logger)(void *, const std::string &)=NULL)
int strain_set_full_scale(int bus, int target_id, unsigned char channel, unsigned int full_scale, int regset=strain_regset_inuse, string *errorstring=NULL)
int strain_set_regulationset(int bus, int target_id, int regset=strain_regset_one, int regsetmode=strain_regsetmode_temporary, string *errorstring=NULL)
@ strain_regsetmode_permanent
@ strain_regsetmode_temporary
int strain_set_calib_bias(int bus, int target_id, string *errorstring=NULL)
int strain_get_amplifier_regs(int bus, int target_id, unsigned char channel, strain2_ampl_regs_t &regs, int regset=strain_regset_inuse, string *errorstring=NULL)
int strain_set_curr_bias(int bus, int target_id, string *errorstring=NULL)
int strain_get_curr_bias(int bus, int target_id, char channel, signed int &bias, string *errorstring=NULL)
int strain_start_sampling(int bus, int target_id, string *errorstring=NULL)
int download_file(int bus, int board_pid, int download_type, bool eeprom)
int strain_get_amplifier_gain_offset(int bus, int target_id, unsigned char channel, float &gain, uint16_t &offset, int regset=strain_regset_inuse, string *errorstring=NULL)
int strain_set_matrix_rc(int bus, int target_id, char r, char c, unsigned int elem, int regset=strain_regset_inuse, string *errorstring=NULL)
int strain_set_amplifier_regs(int bus, int target_id, unsigned char channel, const strain2_ampl_regs_t &regs, int regset=strain_regset_inuse, string *errorstring=NULL)
int strain_set_amplifier_gain_offset(int bus, int target_id, unsigned char channel, float gain, uint16_t offset, int regset=strain_regset_inuse, string *errorstring=NULL)
float strain_amplifier_discretegain2float(strain2_ampl_discretegain_t c)
int strain_calibrate_offset2(int bus, int target_id, icubCanProto_boardType_t boardtype, const std::vector< strain2_ampl_discretegain_t > &gains, const std::vector< int16_t > &targets, string *errorstring=NULL)
int strain_calibrate_offset(int bus, int target_id, icubCanProto_boardType_t boardtype, unsigned int middle_val, string *errorstring=NULL)
virtual int send_message(vector< CanPacket > &canpackets, int n)=0
virtual iDriver2Type type()=0
virtual int init(yarp::os::Searchable &config, bool verbose=true)=0
virtual int receive_message(vector< CanPacket > &canpackets, int howMany=MAX_READ_MSG, double TIMEOUT=1)=0
virtual bool fill(void *data, size_t &size)
bool import(const Registers ®s, WideParams *wideparams=nullptr)
void drv_sleep(double time)
#define EOCANPROT_D_CREATE_CANID(clss, orig, dest)
int getvalue(char *line, int len)
#define SPRS_STATE_ADDRESS
#define BOARD_WAITING_ACK
void drv_sleep(double time)
#define SPRS_STATE_CHECKSUM
#define SPRS_STATE_LENGTH
#define BOARD_DOWNLOADING
strain2_ampl_discretegain_t
icubCanProto_strain_saturationInfo_t saturationinfo[6]
bool applicationisrunning
void load(Gain _g, Offset _o)