iCub-main
Loading...
Searching...
No Matches
firmwareupdatercore.cpp
Go to the documentation of this file.
2#include <qdebug.h>
3#include <EoUpdaterProtocol.h>
4
6
7
8static void updateProgressCallback(float fraction)
9{
10 self->updateProgress(fraction);
11}
12
13// 09/2020 davide.tome@iit.it - address and port configurable in firmwareupdater.ini
14bool FirmwareUpdaterCore::isValidIpAddress(QString addr)
15{
16 QStringList ipFields;
17
18 ipFields = addr.split(".");
19 if(ipFields.count() == 4 && ipFields[3].contains(":"))
20 {
21 QString address_,port_;
22 int ipv0, ipv1, ipv2, ipv3;
23
24 address_ = addr.split(":")[0];
25 port_ = ipFields[3].split(":")[1];
26
27 QRegExp re("\\d*"); // a digit (\d), zero or more times (*)
28 if (!re.exactMatch(port_)) return false;
29 for(int k=0; k<4; k++)
30 {
31 if (!re.exactMatch(address_.split(".")[k])) return false;
32 }
33
34 ipv0 = address_.split(".")[0].toInt();
35 ipv1 = address_.split(".")[1].toInt();
36 ipv2 = address_.split(".")[2].toInt();
37 ipv3 = address_.split(".")[3].toInt();
38
39 if(ipv0 == 10 && 0 < ipv1 < 255 && 0 < ipv2 < 255 && 0 < ipv3 < 255 && 0 < port_.toInt() < 255)
40 {
41 hostIPaddress = EO_COMMON_IPV4ADDR(ipv0, ipv1, ipv2, ipv3);
42 return true;
43 }
44 else return false;
45 }
46 else return false;
47}
48
49FirmwareUpdaterCore::FirmwareUpdaterCore(QObject *parent) : QObject(parent), mutex(QMutex::Recursive)
50{
51 self = this;
52}
53
54bool FirmwareUpdaterCore::init(Searchable& config, int port, QString address, int VerbositY)
55{
56 verbosity = VerbositY;
57
58 mutex.lock();
59
60 setVerbosity(verbosity);
61
62 Bottle sensorSetConfig=config.findGroup("DRIVERS").tail();
63
64 for (int t=0; t<sensorSetConfig.size(); ++t){
65 yarp::os::Bottle sensorConfig(sensorSetConfig.get(t).toString());
66
67 QString type = QString("%1").arg(sensorConfig.get(0).asString().c_str());
68 QString line = QString("%1").arg(sensorConfig.get(1).asString().c_str());
69 if(verbosity>0) qDebug() << type << "-" << line;
70
71 bool ok;
72 int num = QString("%1").arg(line).toInt(&ok);
73 if(ok){
74 devices.append(QPair<QString,QVariant>(type,num));
75 }else{
76 devices.append(QPair<QString,QVariant>(type,line));
77 }
78
79
80 // 09/2020 davide.tome@iit.it - address and port configurable in firmwareupdater.ini
81 if(type == "ETH") {
82
83 if(isValidIpAddress(line))
84 {
85 port = line.split(":")[1].toInt();
86 qDebug() << "IP address FOUND in .ini file, Using :" << line.split(":")[0];
87 qDebug() << "Port Number FOUND in .ini file, Using :" << line.split(":")[1];
88 }
89 else
90 {
91 int ipv0, ipv1, ipv2, ipv3;
92
93 ipv0 = address.split(".")[0].toInt();
94 ipv1 = address.split(".")[1].toInt();
95 ipv2 = address.split(".")[2].toInt();
96 ipv3 = address.split(".")[3].toInt();
97
98 hostIPaddress = EO_COMMON_IPV4ADDR(ipv0, ipv1, ipv2, ipv3);
99
100 qDebug() << "Missing or invalid IP address found in .ini file (format is 10.0.X.Y:Z , 0 < X,Y < 255 , Z port number)";
101 qDebug() << "Skipped, using defaults:";
102 if(verbosity >= 1)
103 {
104 qInfo() << " - IP address:" << DEFAULT_IP_ADDRESS;
105 qInfo() << " - IP port: " << DEFAULT_IP_PORT;
106 }
107
108 }
109 }
110
111 }
112
113 if(!gMNT.open(hostIPaddress, port))
114 {
115 if(verbosity>0) qDebug("Can't open socket, aborting.");
116 mutex.unlock();
117 return false;
118 }
119
120 mutex.unlock();
121 return true;
122}
123
125{
126 verbosity = verb;
127 bool lowers_are_verbose = (verb >= 1) ? true : false;
128 gMNT.verbose(lowers_are_verbose);
129 downloader.set_verbose(lowers_are_verbose);
130
131 return true;
132}
133
135{
136 mutex.lock();
137 QStringList names;
138 for(int i=0;i<devices.count();i++){
139 QPair<QString,QVariant> p = devices.at(i);
140 names.append(p.first);
141 }
142 mutex.unlock();
143
144 return names;
145}
146
148{
149 mutex.lock();
150 bool ret = gMNT.go2maintenance(EthMaintainer::ipv4OfAllSelected, true, 5, 1.0);;
151 mutex.unlock();
152 return ret;
153}
154
159
164
165
166
168{
169 mutex.lock();
171 mutex.unlock();
172 return ret;
173}
174
175QList<QPair<QString,QVariant> > FirmwareUpdaterCore::getDevices()
176{
177 return devices;
178}
179
180void FirmwareUpdaterCore::disconnectFrom(QString device, QString id)
181{
182 // if(!device.isEmpty() && !id.isEmpty() && device.contains("ETH")){
183 // gMNT.boards_get().clear();
184 // yDebug() << "empty eth devices";
185 // qDebug() << "empty eth devices";
186 // }
187 // //connectTo(device,id);
188}
189
190int FirmwareUpdaterCore::connectTo(QString device, QString id)
191{
192 mutex.lock();
193 if(!device.isEmpty() && !id.isEmpty()){
194 if(device.contains("ETH")){
195 int num = gMNT.discover(true, 2, 1.0).size();
196 if(verbosity>0)
197 {
198 yDebug() << "FirmwareUpdaterCore::connectTo() has found " << num << " ETH boards";
199 }
200 mutex.unlock();
201 return num;
202 }else{
203 QString result;
204 QList<sBoard> s = getCanBoardsFromDriver(device,id.toInt(),&result,true);
205 mutex.unlock();
206 return s.count();
207 }
208 }
209 mutex.unlock();
210 return 0;
211}
212
214{
215 for(int i=0;i<gMNT.boards_get().size();i++){
216 QString boardIp = QString("%1").arg(gMNT.boards_get()[i].getIPV4string().c_str());
217 if(boardIp == ip){
218 return gMNT.boards_get()[i].isInMaintenance();
219 }
220 }
221 return false;
222}
223
228
229void FirmwareUpdaterCore::setSelectedEthBoard(int index,bool selected)
230{
231 mutex.lock();
232 if(gMNT.boards_get().size() > index){
233 gMNT.boards_get()[index].setSelected(selected);
234 }
235 mutex.unlock();
237}
238
239void FirmwareUpdaterCore::setSelectedEthBoard(QString boardIp,bool selected)
240{
241 mutex.lock();
242 for(int i=0;i<gMNT.boards_get().size();i++){
243 if(QString("%1").arg(gMNT.boards_get()[i].getIPV4string().c_str()) == boardIp){
244 gMNT.boards_get()[i].setSelected(selected);
245 break;
246 }
247 }
248 mutex.unlock();
250}
251
252void FirmwareUpdaterCore::setSelectedCanBoards(QList <sBoard> selectedBoards,QString address, int deviceId)
253{
254 mutex.lock();
255 QString res;
256 if(!address.isEmpty() && deviceId == -1){
257 getCanBoardsFromEth(address,&res);
258 }else{
259 getCanBoardsFromDriver(address,deviceId,&res);
260 }
261
262 this->canBoards = selectedBoards;
263
264 foreach (sBoard b, selectedBoards) {
265 for(int i=0;i<downloader.board_list_size;i++){
266 if(downloader.board_list[i].bus == b.bus &&
267 downloader.board_list[i].pid == b.pid){
268 downloader.board_list[i].selected = b.selected;
269 downloader.board_list[i].eeprom = b.eeprom;
270 }
271 }
272 }
273
274 mutex.unlock();
276}
277
282
283void FirmwareUpdaterCore::setSelectedCanBoard(int index,bool selected,QString address, int deviceId)
284{
285 mutex.lock();
286// if(!ethAddress.isEmpty()){
287// if(currentAddress != ethAddress){
288// if(downloader.connected){
289// downloader.stopdriver();
290// }
291// QString res;
292// getCanBoardsFromEth(ethAddress,&res);
293// }
294// }
295 QString res;
296 if(!address.isEmpty() && deviceId == -1){
297 getCanBoardsFromEth(address,&res);
298 }else{
299 getCanBoardsFromDriver(address,deviceId,&res);
300 }
301 downloader.board_list[index].selected=selected;
302 mutex.unlock();
304}
305
306
307boardInfo2_t FirmwareUpdaterCore::getMoreDetails(int boardNum,QString *infoString,eOipv4addr_t *address)
308{
309 mutex.lock();
310 boardInfo2_t info = gMNT.boards_get()[boardNum].getInfo();
311 if(address){
312 *address = gMNT.boards_get()[boardNum].getIPV4();
313 if(infoString && info.protversion == 0){
314 *infoString = QString("%1").arg(gMNT.moreinformation(*address, false).c_str());
315 }
316 }
317 mutex.unlock();
318
319 return info;
320
321}
322
323QString FirmwareUpdaterCore::getProcessFromUint(uint8_t id, bool isMultiCore)
324{
325 switch (id) {
326 case uprot_proc_Loader:
327 return "eLoader";
328 case uprot_proc_Updater:
329 return "eUpdater";
330 case uprot_proc_Application00:
331 if (isMultiCore)
332 return "appl.yri" ;
333 else
334 return "eApplication";
335 case uprot_proc_Application01:
336 if (isMultiCore)
337 return "appl.mot" ;
338 else
339 return "eApplication_core_1";
340 case uprot_proc_ApplPROGupdater:
341 return "eApplPROGupdater";
342 default:
343 return "None";
344 }
345}
346
347QList<sBoard> FirmwareUpdaterCore::getCanBoardsFromDriver(QString driver, int networkId, QString *retString, bool force)
348{
349 mutex.lock();
350
351 if(force){
352 downloader.stopdriver();
353 }else{
354 if(downloader.connected && (!currentAddress.isEmpty() || (currentDriver != driver || currentId != networkId ))){
355 downloader.stopdriver();
356 }
357 if(currentDriver == driver && currentId == networkId){
358 mutex.unlock();
359 return canBoards;
360 }
361 }
362
363 canBoards.clear();
364 yarp::os::Property params;
365 QString networkType;
366 if(driver.contains("CFW2",Qt::CaseInsensitive)){
367 networkType="cfw2can";
368 } else if(driver.contains("ECAN",Qt::CaseInsensitive)){
369 networkType = "ecan";
370 } else if(driver.contains("PCAN",Qt::CaseInsensitive)){
371 networkType = "pcan";
372 } else if(driver.contains("SOCKET",Qt::CaseInsensitive)){
373 networkType="socketcan";
374 }
375 params.put("device", networkType.toLatin1().data());
376 params.put("canDeviceNum", networkId);
377 params.put("canTxQueue", 64);
378 params.put("canRxQueue", 64);
379 params.put("canTxTimeout", 2000);
380 params.put("canRxTimeout", 2000);
381
382 //try to connect to the driver
383 int ret = downloader.initdriver(params, (verbosity>1) ? true : false);
384
385 if (0 != ret){
386 if(-2 == ret){
387 if(verbosity>0) qDebug() << "FirmwareUpdaterCore::getCanBoardsFromDriver(): Init ETH driver - The ETH board has just jumped to eUpdater\n Connect again";
388 *retString = "FirmwareUpdaterCore::getCanBoardsFromDriver(): Init ETH driver - The ETH board has just jumped to eUpdater\n Connect again";
389 // TODO DIALOG
390 } else {
391 if(verbosity>0) qDebug() << "FirmwareUpdaterCore::getCanBoardsFromDriver(): Init driver failed - Hardware busy or not connected?!";
392 *retString = "Cannot init driver " + driver + "<" + QString::number(networkId) + "> ... HW is busy or not connected";
393 // TODO DIALOG
394 }
395 mutex.unlock();
396 return canBoards;
397 }
398
399
400 ret = downloader.initschede();
401
402 if (ret == -1)
403 {
404 if(verbosity>0) qDebug() << "FirmwareUpdaterCore::getCanBoardsFromDriver(): No answer received from CAN boards after a successful driver init.";
405 *retString = "No CAN boards found beneath " + driver + "<" + QString::number(networkId) + ">";
406 downloader.stopdriver();
407 currentAddress = "";
408 //not_connected_status();
409 mutex.unlock();
410 return canBoards;
411 }
412
413 for(int i=0; i<downloader.board_list_size;i++){
414 canBoards.append(downloader.board_list[i]);
415 }
416 currentAddress = "";
417 currentDriver = driver;
418 currentId = networkId;
419
420 //downloader.stopdriver();
421 mutex.unlock();
422 return canBoards;
423
424}
425
426QList<sBoard > FirmwareUpdaterCore::getCanBoardsFromEth(QString address, QString *retString, int canID, bool force)
427{
428 mutex.lock();
429
430 if(force){
431 downloader.stopdriver();
432 }else{
433 if(downloader.connected && address != currentAddress && !currentAddress.isEmpty() || (currentAddress.isEmpty() && !currentDriver.isEmpty())){
434 downloader.stopdriver();
435 }
436
437 if(currentAddress == address){
438 mutex.unlock();
439 return canBoards;
440 }
441 }
442
443
444 canBoards.clear();
445 unsigned int remoteAddr;
446 unsigned int localAddr;
447
448
449
450 if (!compile_ip_addresses(address.toLatin1().data(),&remoteAddr,&localAddr)){
451 if(verbosity>0) qDebug() << "FirmwareUpdaterCore::getCanBoardsFromEth(): Init driver failed - Could not find network interface";
452 // TODO DIALOG
453 *retString = "Init driver failed - Could not find network interface";
454 address = "";
455 mutex.unlock();
456 return canBoards;
457 }
458
459
460 yarp::os::Property params;
461 params.put("device", "ETH");
462 params.put("local", int( localAddr));
463 params.put("remote",int(remoteAddr));
464 params.put("canid",canID);
465
466
467 //try to connect to the driver
468 int ret = downloader.initdriver(params, (verbosity>1) ? true : false);
469
470 if (0 != ret){
471 if(-2 == ret){
472 if(verbosity>0) qDebug() << "FirmwareUpdaterCore::getCanBoardsFromEth((): Init ETH driver - The ETH board has just jumped to eUpdater\n Connect again";
473 *retString = "FirmwareUpdaterCore::getCanBoardsFromEth((): Init ETH driver - The ETH board has just jumped to eUpdater\n Connect again";
474 // TODO DIALOG
475 } else {
476 if(verbosity>0) qDebug() << "FirmwareUpdaterCore::getCanBoardsFromEth((): Init driver failed - Hardware busy or not connected?!";
477 *retString = "FirmwareUpdaterCore::getCanBoardsFromEth(): Init driver failed - Hardware busy or not connected?!";
478 // TODO DIALOG
479 }
480 mutex.unlock();
481 return canBoards;
482 }
483
484
485 ret = downloader.initschede();
486
487 if (ret == -1)
488 {
489 if(verbosity>0) qDebug() << "FirmwareUpdaterCore::getCanBoardsFromEth(): No CAN boards found beneath " << address << " after a successful driver init.";
490 *retString = "No CAN boards found beneath " + address;
491 downloader.stopdriver();
492 address = "";
493 //not_connected_status();
494 mutex.unlock();
495 return canBoards;
496 }
497
498 for(int i=0; i<downloader.board_list_size;i++){
499 canBoards.append(downloader.board_list[i]);
500 }
501 currentAddress = address;
502
503 //downloader.stopdriver();
504 mutex.unlock();
505 return canBoards;
506
507}
508
509
510
511bool FirmwareUpdaterCore::compile_ip_addresses(const char* addr,unsigned int *remoteAddr,unsigned int *localAddr)
512{
513 ACE_UINT32 ip1,ip2,ip3,ip4;
514 sscanf(addr,"%d.%d.%d.%d",&ip1,&ip2,&ip3,&ip4);
515 *remoteAddr=(ip1<<24)|(ip2<<16)|(ip3<<8)|ip4;
516
517 size_t count=0;
518 ACE_INET_Addr* addr_array=NULL;
519 int ret=ACE::get_ip_interfaces(count,addr_array);
520
521 if (ret || count<=0)
522 {
523 mutex.unlock();
524 return false;
525 }
526
527 *localAddr=addr_array[0].get_ip_address();
528
529 for (unsigned int a=1; a<count; ++a)
530 {
531 if ((*remoteAddr & 0xFFFF0000)==(addr_array[a].get_ip_address() & 0xFFFF0000))
532 {
533 *localAddr=addr_array[a].get_ip_address();
534 break;
535 }
536 }
537
538 return true;
539}
540
542{
543 mutex.lock();
545 mutex.unlock();
546}
547
549{
550 mutex.lock();
551 QString ret = QString("%1").arg(gMNT.boards_get()[index].getInfoOnEEPROM().c_str());
552 mutex.unlock();
553 return ret;
554}
555
557{
558 mutex.lock();
559 char board_ipaddr[16];
560 ACE_UINT32 ip = ipv4toace(gMNT.boards_get()[index].getIPV4());
561 sprintf(board_ipaddr,"%d.%d.%d.%d",(ip>>24)&0xFF,(ip>>16)&0xFF,(ip>>8)&0xFF,ip&0xFF);
562 mutex.unlock();
563 return QString("%1").arg(board_ipaddr);
564}
565
566bool FirmwareUpdaterCore::setEthBoardInfo(int index, QString newInfo)
567{
568 mutex.lock();
569 eOipv4addr_t address = gMNT.boards_get()[index].getIPV4();
570 bool ret = gMNT.command_info32_set(address, newInfo.toLatin1().data());
571 if(!ret){
572 if(verbosity>0) qDebug() << "setEthBoardInfo failed";
573 }
574
575
576 vector<string> vv = gMNT.command_info32_get(address);
577 foreach (string v, vv) {
578 if(verbosity>0) qDebug() << v.c_str();
579 }
580 // TODO chiedere
581 // it already sets it internally to commandInfo32Get()
582 if(vv.size() > 0){
583 if(verbosity>0) qDebug() << gMNT.boards_get()[index].getInfoOnEEPROM().c_str();
584 }
585 mutex.unlock();
586 return true;
587}
588
589void FirmwareUpdaterCore::setCanBoardInfo(int bus, int id, QString newInfo,QString address, int deviceId,QString *resultString)
590{
591 mutex.lock();
592 QString res;
593 if(!address.isEmpty() && deviceId == -1){
594 getCanBoardsFromEth(address,&res);
595 }else{
596 getCanBoardsFromDriver(address,deviceId,&res);
597 }
598 downloader.change_board_info(bus, id, newInfo.toLatin1().data());
599
600// if(!ethAddress.isEmpty()){
601// if(currentAddress != ethAddress){
602// if(downloader.connected){
603// downloader.stopdriver();
604// }
605// getCanBoardsFromEth(ethAddress,resultString);
606// }
607// downloader.change_board_info(bus, id, newInfo.toLatin1().data());
608// }
609 mutex.unlock();
610}
611
612bool FirmwareUpdaterCore::setCanBoardAddress(int bus, int id, int canType,QString newAddress,QString address,int deviceId,QString *resultString)
613{
614 mutex.lock();
615 QString res;
616 if(!address.isEmpty() && deviceId == -1){
617 getCanBoardsFromEth(address,&res);
618 }else{
619 getCanBoardsFromDriver(address,deviceId,&res);
620 }
621
622 int new_val = newAddress.toInt();
623 if (new_val <=0 || new_val> 15){
624 if(verbosity>0) qDebug() << "Error, new address out of range 0 - 15";
625 return false;
626 }
627
628 if (new_val == id){
629 if(verbosity>0) qDebug() << "Error, same address set";
630 return false;
631 }
632
633 downloader.change_card_address(bus, id, new_val,canType);
634
635// if(!ethAddress.isEmpty()){
636// if(currentAddress != ethAddress){
637// if(downloader.connected){
638// downloader.stopdriver();
639// }
640// getCanBoardsFromEth(ethAddress,resultString);
641// }
642
643// int new_val = newAddress.toInt();
644// if (new_val <=0 || new_val> 15){
645// if(verbosity>0) qDebug() << "Error, new address out of range 0 - 15";
646// return false;
647// }
648
649// if (new_val == id){
650// if(verbosity>0) qDebug() << "Error, same address set";
651// return false;
652// }
653
654// downloader.change_card_address(bus, id, new_val,canType);
655// }
656 mutex.unlock();
657
658 return true;
659}
660
661bool FirmwareUpdaterCore::setEthBoardAddress(int index, QString newAddress)
662{
663
664 mutex.lock();
665 int ip1,ip2,ip3,ip4;
666 sscanf(newAddress.toLatin1().data(),"%d.%d.%d.%d",&ip1,&ip2,&ip3,&ip4);
667 if (ip1<0 || ip1>255 || ip2<0 || ip2>255 || ip3<0 || ip3>255 || ip4<0 || ip4>255){
668 mutex.unlock();
669 return false;
670 }
671 ACE_UINT32 iNewAddress=(ip1<<24)|(ip2<<16)|(ip3<<8)|ip4;
672
673
674 ACE_UINT32 address = ipv4toace(gMNT.boards_get()[index].getIPV4());
675 ACE_UINT32 mask = 0xFFFFFF00;
676
677 if(iNewAddress == (iNewAddress & mask)){ // checks new ip address is not a network address . For example x.y.z.w/24 x.y.z.0
678 if(verbosity>0) qDebug() << "Error Setting address";
679 mutex.unlock();
680 return false;
681 }
682
683 if((~mask) == (iNewAddress & (~mask))){ // checks new ip address is not a broadcast address . For example x.y.z.w/24 x.y.z.255
684 if(verbosity>0) qDebug() << "Error Setting address";
685 mutex.unlock();
686 return false;
687 }
688
689 if (iNewAddress == address){
690 if(verbosity>0) qDebug() << "Error, same address set";
691 mutex.unlock();
692 return false;
693 }
694 char old_addr[16];
695 sprintf(old_addr,"%d.%d.%d.%d",(address>>24)&0xFF,(address>>16)&0xFF,(address>>8)&0xFF,address&0xFF);
696
697 bool ret = gMNT.command_changeaddress(acetoipv4(address), acetoipv4(iNewAddress), true, true, true, true);
698 mutex.unlock();
699 return ret;
700
701
702
703}
704
705
706bool FirmwareUpdaterCore::uploadLoader(QString filename,QString *resultString)
707{
708 mutex.lock();
709 FILE *programFile=fopen(filename.toLatin1().data(),"r");
710 if (!programFile){
711 //TODO ERROR
712 if(verbosity>0) qDebug() << "Error opening the selected file!";
713 mutex.unlock();
714 return false;
715 }
716 eOipv4addr_t ipv4 = 0; // all selected
717 eObrd_ethtype_t type = eobrd_ethtype_none;
718 eOversion_t ver;
719 ver.major = 0;
720 ver.minor = 0;
721 std::string result;
722 bool ok = gMNT.program(ipv4, type, eLoader, ver, programFile, false, updateProgressCallback, false);
723
724 fclose(programFile);
725
726 *resultString = QString("%1").arg(result.c_str());
727 if(ok){
728 mutex.unlock();
729 return true;
730 }
731 mutex.unlock();
732 return false;
733}
734
735
736bool FirmwareUpdaterCore::uploadUpdater(QString filename,QString *resultString)
737{
738 mutex.lock();
739 FILE *programFile=fopen(filename.toLatin1().data(),"r");
740 if (!programFile){
741 //TODO ERROR
742 if(verbosity>0) qDebug() << "Error opening the selected file!";
743 mutex.unlock();
744 return false;
745 }
746 eOipv4addr_t ipv4 = 0; // all selected
747 eObrd_ethtype_t type = eobrd_ethtype_none;
748 eOversion_t ver;
749 ver.major = 0;
750 ver.minor = 0;
751 std::string result;
752 bool ok = gMNT.program(ipv4, type, eUpdater, ver, programFile, false, updateProgressCallback, false);
753
754 fclose(programFile);
755
756 *resultString = QString("%1").arg(result.c_str());
757 if(ok){
758 mutex.unlock();
759 return true;
760 }
761 mutex.unlock();
762 return false;
763}
764
765
766#ifdef SERIALMETHOD
767bool FirmwareUpdaterCore::uploadCanApplication(QString filename,QString *resultString, QString ethAddress)
768{
769 mutex.lock();
770 if(!ethAddress.isEmpty()){
771 if(currentAddress != ethAddress){
772 if(downloader.connected){
773 downloader.stopdriver();
774 }
775 getCanBoardsFromEth(ethAddress,resultString);
776 }
777
778 }
779 double timer_start =0;
780 double timer_end =0;
781
782 if (downloader.connected == false){
783 *resultString ="Driver not running";
784 mutex.unlock();
785 return false;
786 }
787
788 //check if at least one board was selected
789 bool at_least_one_board_selected = false;
790
791 for (int i=0; i<downloader.board_list_size; i++){
792 if (downloader.board_list[i].status==BOARD_RUNNING &&
793 downloader.board_list[i].selected==true)
794 at_least_one_board_selected = true;
795 }
796
797 if (!at_least_one_board_selected){
798 *resultString = "No Boards selected! - Select one or more boards to update the firmware";
799 mutex.unlock();
800 return false;
801 }
802
803 QMap<int,int> canDevices;
804 for (int i=0; i<downloader.board_list_size; i++)
805 {
806 if (downloader.board_list[i].selected==true)
807 {
808 canDevices.insertMulti(downloader.board_list[i].bus,i);
809 downloader.board_list[i].selected = false;
810 if(verbosity>0) qDebug() << "FOUND SELECTED SCHEDA " << i << " ON BUS " << downloader.board_list[i].bus;
811 }
812 }
813
814 int ret = 0;
815 int finished = 0;
816 int busCount = canDevices.uniqueKeys().count();
817 for(int k=0;k<busCount;k++){
818
819 int bus = canDevices.uniqueKeys().at(k);
820
821 if (downloader.open_file(filename.toLatin1().data())!=0){
822 *resultString = "Error opening the selected file!";
823 mutex.unlock();
824 return false;
825 }
826 if(verbosity>0) qDebug() << "FILE " << filename << " OPENED";
827 //TODO
828 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
829 // if (strstr (buffer, "calibrationDataSN") != 0)
830 // {
831 // load_calibration (buffer);
832 // return ALL_OK;
833 // }
834 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
835
836 // Get an identification of the firmware fot the file that you have selected
837 // int firmware_board_type=0;
838 // int firmware_version=0;
839 // int firmware_revision=0;
840
841 //indentify download type from the type of the selected boards
842 int download_type = icubCanProto_boardType__unknown;
843 bool download_eeprom =false;
844
845
846 QList<int> indexes = canDevices.values(bus);
847// foreach (int index, indexes) {
848// downloader.board_list[index].selected = true;
849// if(verbosity>0) qDebug() << "SELECTING BOARD " << index << " OF BUS " << k;
850// }
851
852
853 for(int i=0;i<indexes.count();i++){
854 int index = indexes.at(i);
855 downloader.board_list[index].selected = true;
856 if(verbosity>0) qDebug() << "SELECTING BOARD " << index << " OF BUS " << bus;
857 if (downloader.board_list[index].status==BOARD_RUNNING){
858 if (downloader.startscheda(bus,
859 downloader.board_list[index].pid,
860 downloader.board_list[index].eeprom,
861 downloader.board_list[index].type)!=0){
862 *resultString = "Unable to start the board - Unable to send message 'start' or no answer received";
863 mutex.unlock();
864 return false;
865 } else {
866 if(verbosity>0) qDebug() << "START SCHEDA " << index << " ON BUS " << bus << " OK";
867 downloader.board_list[index].status=BOARD_WAITING;
868 }
869 download_type = downloader.board_list[index].type;
870 download_eeprom = downloader.board_list[index].eeprom;
871 }
872 }
873
874
875
876// // Start the download for the selected boards
877// for (int i=0; i<downloader.board_list_size; i++){
878// if (downloader.board_list[i].status==BOARD_RUNNING && downloader.board_list[i].selected==true){
879// if (downloader.startscheda(downloader.board_list[i].bus,
880// downloader.board_list[i].pid,
881// downloader.board_list[i].eeprom,
882// downloader.board_list[i].type)!=0){
883// *resultString = "Unable to start the board - Unable to send message 'start' or no answer received";
884// return false;
885// } else {
886// if(verbosity>0) qDebug() << "START SCHEDA " << i << " OK";
887// downloader.board_list[i].status=BOARD_WAITING;
888// }
889// download_type = downloader.board_list[i].type;
890// download_eeprom = downloader.board_list[i].eeprom;
891// }
892// }
893
894
895
896 timer_start= yarp::os::Time::now();
897 finished = 0;
898 bool print00 = false, print25 = false, print50 = false, print75 = false, print99 = false;
899 // Start the download for the selected boards
900 do
901 {
902 ret = downloader.download_file(bus, 0x0F, download_type,download_eeprom);
903 if (float(downloader.progress)/downloader.file_length/busCount >0.0 && print00==false) {if(verbosity>0) qDebug("downloading %s, 1%% done\n",filename.toLatin1().data()); print00=true;}
904 if (float(downloader.progress)/downloader.file_length/busCount >0.25 && print25==false) {if(verbosity>0) qDebug("downloading %s, 25%% done\n",filename.toLatin1().data()); print25=true;}
905 if (float(downloader.progress)/downloader.file_length/busCount >0.50 && print50==false) {if(verbosity>0) qDebug("downloading %s, 50%% done\n",filename.toLatin1().data()); print50=true;}
906 if (float(downloader.progress)/downloader.file_length/busCount >0.75 && print75==false) {if(verbosity>0) qDebug("downloading %s, 75%% done\n",filename.toLatin1().data()); print75=true;}
907 if (float(downloader.progress)/downloader.file_length/busCount >0.99 && print99==false) {if(verbosity>0) qDebug("downloading %s, finished!\n",filename.toLatin1().data()); print99=true;}
908
909 if (ret==1){
910 updateProgress(float(downloader.progress)/downloader.file_length/busCount);
911 }
912 if (ret==-1){
913 if(verbosity>0) qDebug() << "Fatal Error during download, terminate";
914 *resultString = "Fatal Error during download, terminate";
915 finished = 1;
916 }
917 if (ret==0){
918 if(verbosity>0) qDebug() << "Download terminated";
919 *resultString = "Download terminated";
920 finished = 1;
921 }
922
923 }
924 while (finished!=1);
925
926 // End the download for the selected boards
927
928 if(downloader.stopscheda(bus, 15) != 0){
929 if(verbosity>0) qDebug() << "ERROR STOPPING SCHEDA";
930 }else{
931 if(verbosity>0) qDebug() << "scheda stopped";
932 }
933
934 foreach (int index, indexes) {
935 downloader.board_list[index].selected = false;
936 if(verbosity>0) qDebug() << "DE-SELECTING BOARD " << index << " OF BUS " << bus;
937 }
938
939
940
941 }
942 timer_end= yarp::os::Time::now();
943
944
945
946
947 //Display result message
948 if (ret == 0)
949 {
950 char time_text [50];
951 double download_time = (timer_end-timer_start) ;
952 sprintf (time_text, "All Board OK! Download Time (s): %.2f", download_time);
953
954 *resultString = QString("Download Finished. %1").arg(time_text);
955
956 updateProgress(1.0);
957 mutex.unlock();
958 return true;
959 }
960 else
961 {
962 //*resultString = "Error during file transfer";
963
964 updateProgress(1.0);
965 mutex.unlock();
966 return false;
967 }
968
969 mutex.unlock();
970 return true;
971}
972
973#else
974bool FirmwareUpdaterCore::uploadCanApplication(QString filename,QString *resultString, bool ee, QString address,int deviceId,QList <sBoard> *resultCanBoards)
975{
976// if(!address.isEmpty()){
977// if(currentAddress != address){
978// if(downloader.connected){
979// downloader.stopdriver();
980// }
981// getCanBoardsFromEth(address,resultString);
982// }
983
984// }
985 QString res;
986 if(!address.isEmpty() && deviceId == -1){
987 getCanBoardsFromEth(address,&res);
988 }else{
989 getCanBoardsFromDriver(address,deviceId,&res);
990 }
991
992
993 double timer_start =0;
994 double timer_end =0;
995
996 if (downloader.connected == false){
997 *resultString ="Driver not running";
998 return false;
999 }
1000
1001 //check if at least one board was selected
1002 bool at_least_one_board_selected = false;
1003 int i = 0;
1004
1005 for (i=0; i<downloader.board_list_size; i++){
1006 if (downloader.board_list[i].status==BOARD_RUNNING &&
1007 downloader.board_list[i].selected==true)
1008 at_least_one_board_selected = true;
1009 }
1010
1011 if (!at_least_one_board_selected){
1012 *resultString = "No Boards selected! - Select one or more boards to update the firmware";
1013 return false;
1014 }
1015 if (downloader.open_file(filename.toLatin1().data())!=0){
1016 *resultString = "Error opening the selected file!";
1017 return false;
1018 }
1019 //TODO
1020//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1021 // if (strstr (buffer, "calibrationDataSN") != 0)
1022 // {
1023 // load_calibration (buffer);
1024 // return ALL_OK;
1025 // }
1026//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1027
1028 // Get an identification of the firmware fot the file that you have selected
1029 int firmware_board_type=0;
1030 int firmware_version=0;
1031 int firmware_revision=0;
1032
1033 //indentify download type from the type of the selected boards
1034 int download_type = icubCanProto_boardType__unknown;
1035 bool download_eeprom =false;
1036 for (i=0; i<downloader.board_list_size; i++)
1037 {
1038 if (downloader.board_list[i].selected==true)
1039 {
1040 download_type = downloader.board_list[i].type;
1041 download_eeprom = downloader.board_list[i].eeprom;
1042 }
1043
1044 }
1045 download_eeprom = ee;
1046
1047 // Start the download for the selected boards
1048 for (i=0; i<downloader.board_list_size; i++){
1049 if (downloader.board_list[i].status==BOARD_RUNNING && downloader.board_list[i].selected==true){
1050 //bool EE = downloader.board_list[i].eeprom;
1051 bool EE = ee;
1052 if (downloader.startscheda(downloader.board_list[i].bus, downloader.board_list[i].pid, EE, downloader.board_list[i].type)!=0){
1053 *resultString = "Unable to start the board - Unable to send message 'start' or no answer received";
1054 return false;
1055 } else {
1056 downloader.board_list[i].status=BOARD_WAITING;
1057 }
1058 }
1059 }
1060
1061 int ret = 0;
1062 int finished = 0;
1063
1064 timer_start= yarp::os::Time::now();
1065
1066// bool acemortest_notyetstopped = true;
1067// const float acemortest_progress = 0.10;
1068
1069 bool print00 = false, print25 = false, print50 = false, print75 = false, print99 = false;
1070 // Start the download for the selected boards
1071 do
1072 {
1073 ret = downloader.download_file(CanPacket::everyCANbus, 0x0F, download_type,download_eeprom);
1074 if (float(downloader.progress)/downloader.file_length >0.0 && print00==false) {if(verbosity>0) qDebug("programming %s: 1%% done",filename.toLatin1().data()); print00=true;}
1075 if (float(downloader.progress)/downloader.file_length >0.25 && print25==false) {if(verbosity>0) qDebug("programming %s: 25%% done",filename.toLatin1().data()); print25=true;}
1076 if (float(downloader.progress)/downloader.file_length >0.50 && print50==false) {if(verbosity>0) qDebug("programming %s: 50%% done",filename.toLatin1().data()); print50=true;}
1077 if (float(downloader.progress)/downloader.file_length >0.75 && print75==false) {if(verbosity>0) qDebug("programming %s: 75%% done",filename.toLatin1().data()); print75=true;}
1078 if (float(downloader.progress)/downloader.file_length >0.99 && print99==false) {if(verbosity>0) qDebug("programming %s: finished!",filename.toLatin1().data()); print99=true;}
1079
1080// if ((float(downloader.progress)/downloader.file_length > acemortest_progress) && (acemortest_notyetstopped))
1081// {
1082// // place you breakpoint in here.
1083// acemortest_notyetstopped = false;
1084// }
1085
1086 if (ret==1)
1087 {
1088 updateProgress(float(downloader.progress)/downloader.file_length);
1089 }
1090 if (ret==-1)
1091 {
1092 *resultString = "Fatal Error during download, terminate";
1093 finished = 1;
1094 }
1095 if (ret==0)
1096 {
1097 *resultString = "Download terminated";
1098 finished = 1;
1099 }
1100
1101 }
1102 while (finished!=1);
1103 timer_end= yarp::os::Time::now();
1104
1105 // End the download for the selected boards
1106 int errors =0;
1107 downloader.stopscheda(CanPacket::everyCANbus, 15);
1108
1109
1110
1111 yarp::os::Time::delay(3.0);
1112 //Display result message
1113 if (ret == 0)
1114 {
1115 char time_text [50];
1116 double download_time = (timer_end-timer_start) ;
1117 sprintf (time_text, "All Board OK! Download Time (s): %.2f", download_time);
1118
1119 *resultString = QString("Download Finished. %1").arg(time_text);
1120
1121 updateProgress(1.0);
1122 downloader.initschede();
1123
1124 canBoards.clear();
1125 for(int i=0; i<downloader.board_list_size;i++){
1126 canBoards.append(downloader.board_list[i]);
1127 }
1128 if(resultCanBoards){
1129 *resultCanBoards = canBoards;
1130 }
1131 return true;
1132 }
1133 else
1134 {
1135 //*resultString = "Error during file transfer";
1136
1137 updateProgress(1.0);
1138 downloader.initschede();
1139 return false;
1140 }
1141 downloader.initschede();
1142
1143 canBoards.clear();
1144 for(int i=0; i<downloader.board_list_size;i++){
1145 canBoards.append(downloader.board_list[i]);
1146 }
1147 *resultCanBoards = canBoards;
1148 return true;
1149}
1150#endif
1151
1152bool FirmwareUpdaterCore::uploadEthApplication(QString filename,QString *resultString)
1153{
1154 mutex.lock();
1155 FILE *programFile=fopen(filename.toLatin1().data(),"r");
1156// if(verbosity>0) qDebug() << "attempting opening the selected file:" << filename << "or .." << filename.toLatin1().data();
1157 if (!programFile){
1158 //TODO ERROR
1159 if(verbosity>0) qDebug() << "Error opening the selected file:" << filename << "or .." << filename.toLatin1().data();
1160 mutex.unlock();
1161 return false;
1162 }
1163 eOipv4addr_t ipv4 = 0; // all selected
1164 eObrd_ethtype_t type = eobrd_ethtype_none;
1165 eOversion_t ver;
1166 ver.major = 0;
1167 ver.minor = 0;
1168 std::string result;
1169 bool ok = gMNT.program(ipv4, type, eApplication, ver, programFile, false, updateProgressCallback, false);
1170
1171 fclose(programFile);
1172
1173 *resultString = QString("%1").arg(result.c_str());
1174 if(ok){
1175 mutex.unlock();
1176 return true;
1177 }
1178 mutex.unlock();
1179 return false;
1180}
1181
1182
1183
1185{
1186 return &downloader;
1187}
1188
1189
1190
1192{
1193 mutex.lock();
1195 mutex.unlock();
1196}
1197
1198
1200{
1201 mutex.lock();
1202 gMNT.command_def2run(EthMaintainer::ipv4OfAllSelected, eApplication, false, false);
1203 mutex.unlock();
1204}
1205
1207{
1208 mutex.lock();
1209 gMNT.command_def2run(EthMaintainer::ipv4OfAllSelected, eUpdater, false, false);
1210 mutex.unlock();
1211}
1212
1213void FirmwareUpdaterCore::selectCanBoardsByAddresses(const std::vector<std::pair<int, int>>& addresses)
1214{
1215 mutex.lock();
1216 QSet<QPair<int, int>> addresses_set;
1217 for (const auto& addr : addresses) {
1218 addresses_set.insert(qMakePair(addr.first, addr.second));
1219 }
1220 for (int i = 0; i < downloader.board_list_size; ++i) {
1221 downloader.board_list[i].selected = addresses_set.contains(qMakePair(downloader.board_list[i].bus, downloader.board_list[i].pid));
1222 }
1223 mutex.unlock();
1224}
1225
1227 QMutexLocker locker(&mutex);
1228 QList<sBoard> result;
1229 for (int i = 0; i < downloader.board_list_size; ++i) {
1230 if (downloader.board_list[i].selected)
1231 result.append(downloader.board_list[i]);
1232 }
1233 return result;
1234}
eOipv4addr_t acetoipv4(ACE_UINT32 address)
ACE_UINT32 ipv4toace(eOipv4addr_t ipv4)
@ everyCANbus
Definition driver.h:51
std::string moreinformation(eOipv4addr_t ipv4, bool forcemaintenance=false)
bool command_jump2updater(eOipv4addr_t ipv4)
EthBoardList discover(bool clearbeforediscovery=true, int numberofdiscoveries=1, double waittimeout=1.0)
static const eOipv4addr_t ipv4OfAllSelected
bool open(eOipv4addr_t ipv4=hostIPaddress, eOipv4port_t port=mainIPport)
bool command_def2run(eOipv4addr_t ipv4, eOuprot_process_t process, bool forcemaintenance=true, bool verify=true)
bool go2application(eOipv4addr_t ipv4, bool checkdef2runapplication=true, double bootstraptime=10.0, bool verify=true)
EthBoardList & boards_get(void)
void verbose(bool on)
bool go2maintenance(eOipv4addr_t ipv4, bool verify=true, int retries=6, double timegap=1.0)
bool command_info32_set(eOipv4addr_t ipv4, const string &info32)
vector< string > command_info32_get(eOipv4addr_t ipv4)
bool command_blink(eOipv4addr_t ipv4)
bool program(eOipv4addr_t ipv4, eObrd_ethtype_t type, eOuprot_process_t process, eOversion_t targetversion, FILE *fp, bool forcemaintenance=true, void progress(float)=NULL, bool restart2application=true)
bool command_eeprom_erase(eOipv4addr_t ipv4)
bool command_restart(eOipv4addr_t ipv4)
bool command_changeaddress(eOipv4addr_t ipv4, eOipv4addr_t ipv4new, bool checkifnewispresent=true, bool forcemaintenance=true, bool restart=false, bool verify=false)
QList< sBoard > getSelectedCanBoards()
QList< sBoard > getCanBoardsFromDriver(QString driver, int networkId, QString *retString, bool force=false)
int connectTo(QString device, QString id)
void setSelectedCanBoards(QList< sBoard > selectedBoards, QString address, int deviceId=-1)
bool setEthBoardAddress(int index, QString newAddress)
bool uploadCanApplication(QString filename, QString *resultString, bool ee, QString address="", int deviceId=-1, QList< sBoard > *resultCanBoards=NULL)
QString getProcessFromUint(uint8_t id, bool isMultiCore=false)
QString getEthBoardInfo(int index)
QList< sBoard > getCanBoardsFromEth(QString address, QString *retString, int canID=CanPacket::everyCANbus, bool force=false)
void setSelectedEthBoard(int index, bool selected)
void disconnectFrom(QString device, QString id)
FirmwareUpdaterCore(QObject *parent=0)
void setSelectedCanBoard(int index, bool selected, QString ethAddress="", int deviceId=-1)
QString getEthBoardAddress(int index)
boardInfo2_t getMoreDetails(int boardNum=EthMaintainer::ipv4OfAllSelected, QString *infoString=NULL, eOipv4addr_t *address=NULL)
void selectCanBoardsByAddresses(const std::vector< std::pair< int, int > > &addresses)
QList< QPair< QString, QVariant > > getDevices()
void updateProgress(float)
bool setEthBoardInfo(int index, QString newInfo)
bool uploadUpdater(QString filename, QString *resultString)
bool isBoardInMaintenanceMode(QString ip)
void setCanBoardInfo(int bus, int id, QString newInfo, QString ethAddress="", int deviceId=-1, QString *resultString=NULL)
bool setCanBoardAddress(int bus, int id, int canType, QString newAddress, QString ethAddress="", int deviceId=-1, QString *resultString=NULL)
bool uploadEthApplication(QString filename, QString *resultString)
bool uploadLoader(QString filename, QString *resultString)
bool init(Searchable &config, int port, QString address, int VerbositY)
int open_file(std::string file)
int change_card_address(int bus, int target_id, int new_id, int board_type)
int startscheda(int bus, int board_pid, bool board_eeprom, int download_type)
int stopscheda(int bus, int board_pid)
void set_verbose(bool verbose)
int change_board_info(int bus, int target_id, char *board_info)
int initdriver(yarp::os::Searchable &config, bool verbose=true)
sBoard * board_list
Definition downloader.h:150
int board_list_size
Definition downloader.h:151
int download_file(int bus, int board_pid, int download_type, bool eeprom)
#define BOARD_RUNNING
Definition downloader.h:45
#define BOARD_WAITING
Definition downloader.h:46
FirmwareUpdaterCore * self
static void updateProgressCallback(float fraction)
#define DEFAULT_IP_ADDRESS
#define DEFAULT_IP_PORT
int canID
Definition main.cpp:152
std::string networkType
Definition main.cpp:156
unsigned int remoteAddr
Definition main.cpp:154
unsigned int localAddr
Definition main.cpp:153
int networkId
Definition main.cpp:151
fclose(fileID)
bool eeprom
Definition downloader.h:39
int bus
Definition downloader.h:25
int type
Definition downloader.h:27
int pid
Definition downloader.h:26
int status
Definition downloader.h:37
bool selected
Definition downloader.h:38