3#include <EoUpdaterProtocol.h>
14bool FirmwareUpdaterCore::isValidIpAddress(QString addr)
18 ipFields = addr.split(
".");
19 if(ipFields.count() == 4 && ipFields[3].contains(
":"))
21 QString address_,port_;
22 int ipv0, ipv1, ipv2, ipv3;
24 address_ = addr.split(
":")[0];
25 port_ = ipFields[3].split(
":")[1];
28 if (!re.exactMatch(port_))
return false;
29 for(
int k=0; k<4; k++)
31 if (!re.exactMatch(address_.split(
".")[k]))
return false;
34 ipv0 = address_.split(
".")[0].toInt();
35 ipv1 = address_.split(
".")[1].toInt();
36 ipv2 = address_.split(
".")[2].toInt();
37 ipv3 = address_.split(
".")[3].toInt();
39 if(ipv0 == 10 && 0 < ipv1 < 255 && 0 < ipv2 < 255 && 0 < ipv3 < 255 && 0 < port_.toInt() < 255)
41 hostIPaddress = EO_COMMON_IPV4ADDR(ipv0, ipv1, ipv2, ipv3);
56 verbosity = VerbositY;
62 Bottle sensorSetConfig=config.findGroup(
"DRIVERS").tail();
64 for (
int t=0; t<sensorSetConfig.size(); ++t){
65 yarp::os::Bottle sensorConfig(sensorSetConfig.get(t).toString());
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;
72 int num = QString(
"%1").arg(line).toInt(&
ok);
74 devices.append(QPair<QString,QVariant>(type,num));
76 devices.append(QPair<QString,QVariant>(type,line));
83 if(isValidIpAddress(line))
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];
91 int ipv0, ipv1, ipv2, ipv3;
93 ipv0 = address.split(
".")[0].toInt();
94 ipv1 = address.split(
".")[1].toInt();
95 ipv2 = address.split(
".")[2].toInt();
96 ipv3 = address.split(
".")[3].toInt();
98 hostIPaddress = EO_COMMON_IPV4ADDR(ipv0, ipv1, ipv2, ipv3);
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:";
113 if(!gMNT.
open(hostIPaddress, port))
115 if(verbosity>0) qDebug(
"Can't open socket, aborting.");
127 bool lowers_are_verbose = (verb >= 1) ?
true :
false;
128 gMNT.
verbose(lowers_are_verbose);
138 for(
int i=0;i<devices.count();i++){
139 QPair<QString,QVariant>
p = devices.at(i);
140 names.append(
p.first);
193 if(!device.isEmpty() && !
id.isEmpty()){
194 if(device.contains(
"ETH")){
198 yDebug() <<
"FirmwareUpdaterCore::connectTo() has found " << num <<
" ETH boards";
216 QString boardIp = QString(
"%1").arg(gMNT.
boards_get()[i].getIPV4string().c_str());
218 return gMNT.
boards_get()[i].isInMaintenance();
233 gMNT.
boards_get()[index].setSelected(selected);
243 if(QString(
"%1").arg(gMNT.
boards_get()[i].getIPV4string().c_str()) == boardIp){
256 if(!address.isEmpty() && deviceId == -1){
262 this->canBoards = selectedBoards;
264 foreach (
sBoard b, selectedBoards) {
296 if(!address.isEmpty() && deviceId == -1){
312 *address = gMNT.
boards_get()[boardNum].getIPV4();
313 if(infoString && info.protversion == 0){
314 *infoString = QString(
"%1").arg(gMNT.
moreinformation(*address,
false).c_str());
326 case uprot_proc_Loader:
328 case uprot_proc_Updater:
330 case uprot_proc_Application00:
334 return "eApplication";
335 case uprot_proc_Application01:
339 return "eApplication_core_1";
340 case uprot_proc_ApplPROGupdater:
341 return "eApplPROGupdater";
354 if(downloader.
connected && (!currentAddress.isEmpty() || (currentDriver != driver || currentId !=
networkId ))){
357 if(currentDriver == driver && currentId ==
networkId){
364 yarp::os::Property params;
366 if(driver.contains(
"CFW2",Qt::CaseInsensitive)){
368 }
else if(driver.contains(
"ECAN",Qt::CaseInsensitive)){
370 }
else if(driver.contains(
"PCAN",Qt::CaseInsensitive)){
372 }
else if(driver.contains(
"SOCKET",Qt::CaseInsensitive)){
375 params.put(
"device",
networkType.toLatin1().data());
377 params.put(
"canTxQueue", 64);
378 params.put(
"canRxQueue", 64);
379 params.put(
"canTxTimeout", 2000);
380 params.put(
"canRxTimeout", 2000);
383 int ret = downloader.
initdriver(params, (verbosity>1) ?
true :
false);
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";
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";
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) +
">";
417 currentDriver = driver;
433 if(downloader.
connected && address != currentAddress && !currentAddress.isEmpty() || (currentAddress.isEmpty() && !currentDriver.isEmpty())){
437 if(currentAddress == address){
451 if(verbosity>0) qDebug() <<
"FirmwareUpdaterCore::getCanBoardsFromEth(): Init driver failed - Could not find network interface";
453 *retString =
"Init driver failed - Could not find network interface";
460 yarp::os::Property params;
461 params.put(
"device",
"ETH");
464 params.put(
"canid",
canID);
468 int ret = downloader.
initdriver(params, (verbosity>1) ?
true :
false);
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";
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?!";
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;
501 currentAddress = address;
511bool FirmwareUpdaterCore::compile_ip_addresses(
const char* addr,
unsigned int *
remoteAddr,
unsigned int *
localAddr)
513 ACE_UINT32 ip1,ip2,ip3,ip4;
514 sscanf(addr,
"%d.%d.%d.%d",&ip1,&ip2,&ip3,&ip4);
518 ACE_INET_Addr* addr_array=NULL;
519 int ret=ACE::get_ip_interfaces(count,addr_array);
527 *
localAddr=addr_array[0].get_ip_address();
529 for (
unsigned int a=1; a<count; ++a)
531 if ((*
remoteAddr & 0xFFFF0000)==(addr_array[a].get_ip_address() & 0xFFFF0000))
533 *
localAddr=addr_array[a].get_ip_address();
551 QString ret = QString(
"%1").arg(gMNT.
boards_get()[index].getInfoOnEEPROM().c_str());
559 char board_ipaddr[16];
561 sprintf(board_ipaddr,
"%d.%d.%d.%d",(ip>>24)&0xFF,(ip>>16)&0xFF,(ip>>8)&0xFF,ip&0xFF);
563 return QString(
"%1").arg(board_ipaddr);
569 eOipv4addr_t address = gMNT.
boards_get()[index].getIPV4();
572 if(verbosity>0) qDebug() <<
"setEthBoardInfo failed";
577 foreach (
string v, vv) {
578 if(verbosity>0) qDebug() << v.c_str();
583 if(verbosity>0) qDebug() << gMNT.
boards_get()[index].getInfoOnEEPROM().c_str();
593 if(!address.isEmpty() && deviceId == -1){
616 if(!address.isEmpty() && deviceId == -1){
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";
629 if(verbosity>0) qDebug() <<
"Error, same address set";
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){
671 ACE_UINT32 iNewAddress=(ip1<<24)|(ip2<<16)|(ip3<<8)|ip4;
675 ACE_UINT32 mask = 0xFFFFFF00;
677 if(iNewAddress == (iNewAddress & mask)){
678 if(verbosity>0) qDebug() <<
"Error Setting address";
683 if((~mask) == (iNewAddress & (~mask))){
684 if(verbosity>0) qDebug() <<
"Error Setting address";
689 if (iNewAddress == address){
690 if(verbosity>0) qDebug() <<
"Error, same address set";
695 sprintf(old_addr,
"%d.%d.%d.%d",(address>>24)&0xFF,(address>>16)&0xFF,(address>>8)&0xFF,address&0xFF);
709 FILE *programFile=fopen(filename.toLatin1().data(),
"r");
712 if(verbosity>0) qDebug() <<
"Error opening the selected file!";
716 eOipv4addr_t ipv4 = 0;
717 eObrd_ethtype_t type = eobrd_ethtype_none;
726 *resultString = QString(
"%1").arg(result.c_str());
739 FILE *programFile=fopen(filename.toLatin1().data(),
"r");
742 if(verbosity>0) qDebug() <<
"Error opening the selected file!";
746 eOipv4addr_t ipv4 = 0;
747 eObrd_ethtype_t type = eobrd_ethtype_none;
756 *resultString = QString(
"%1").arg(result.c_str());
770 if(!ethAddress.isEmpty()){
771 if(currentAddress != ethAddress){
779 double timer_start =0;
783 *resultString =
"Driver not running";
789 bool at_least_one_board_selected =
false;
794 at_least_one_board_selected =
true;
797 if (!at_least_one_board_selected){
798 *resultString =
"No Boards selected! - Select one or more boards to update the firmware";
803 QMap<int,int> canDevices;
810 if(verbosity>0) qDebug() <<
"FOUND SELECTED SCHEDA " << i <<
" ON BUS " << downloader.
board_list[i].
bus;
816 int busCount = canDevices.uniqueKeys().count();
817 for(
int k=0;k<busCount;k++){
819 int bus = canDevices.uniqueKeys().at(k);
821 if (downloader.
open_file(filename.toLatin1().data())!=0){
822 *resultString =
"Error opening the selected file!";
826 if(verbosity>0) qDebug() <<
"FILE " << filename <<
" OPENED";
842 int download_type = icubCanProto_boardType__unknown;
843 bool download_eeprom =
false;
846 QList<int> indexes = canDevices.values(bus);
853 for(
int i=0;i<indexes.count();i++){
854 int index = indexes.at(i);
856 if(verbosity>0) qDebug() <<
"SELECTING BOARD " << index <<
" OF BUS " << bus;
862 *resultString =
"Unable to start the board - Unable to send message 'start' or no answer received";
866 if(verbosity>0) qDebug() <<
"START SCHEDA " << index <<
" ON BUS " << bus <<
" OK";
896 timer_start= yarp::os::Time::now();
898 bool print00 =
false, print25 =
false, print50 =
false, print75 =
false, print99 =
false;
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;}
913 if(verbosity>0) qDebug() <<
"Fatal Error during download, terminate";
914 *resultString =
"Fatal Error during download, terminate";
918 if(verbosity>0) qDebug() <<
"Download terminated";
919 *resultString =
"Download terminated";
929 if(verbosity>0) qDebug() <<
"ERROR STOPPING SCHEDA";
931 if(verbosity>0) qDebug() <<
"scheda stopped";
934 foreach (
int index, indexes) {
936 if(verbosity>0) qDebug() <<
"DE-SELECTING BOARD " << index <<
" OF BUS " << bus;
942 timer_end= yarp::os::Time::now();
951 double download_time = (timer_end-timer_start) ;
952 sprintf (time_text,
"All Board OK! Download Time (s): %.2f", download_time);
954 *resultString = QString(
"Download Finished. %1").arg(time_text);
986 if(!address.isEmpty() && deviceId == -1){
993 double timer_start =0;
997 *resultString =
"Driver not running";
1002 bool at_least_one_board_selected =
false;
1008 at_least_one_board_selected =
true;
1011 if (!at_least_one_board_selected){
1012 *resultString =
"No Boards selected! - Select one or more boards to update the firmware";
1015 if (downloader.
open_file(filename.toLatin1().data())!=0){
1016 *resultString =
"Error opening the selected file!";
1029 int firmware_board_type=0;
1030 int firmware_version=0;
1031 int firmware_revision=0;
1034 int download_type = icubCanProto_boardType__unknown;
1035 bool download_eeprom =
false;
1045 download_eeprom = ee;
1053 *resultString =
"Unable to start the board - Unable to send message 'start' or no answer received";
1064 timer_start= yarp::os::Time::now();
1069 bool print00 =
false, print25 =
false, print50 =
false, print75 =
false, print99 =
false;
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;}
1092 *resultString =
"Fatal Error during download, terminate";
1097 *resultString =
"Download terminated";
1102 while (finished!=1);
1103 timer_end= yarp::os::Time::now();
1111 yarp::os::Time::delay(3.0);
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);
1119 *resultString = QString(
"Download Finished. %1").arg(time_text);
1128 if(resultCanBoards){
1129 *resultCanBoards = canBoards;
1147 *resultCanBoards = canBoards;
1155 FILE *programFile=fopen(filename.toLatin1().data(),
"r");
1159 if(verbosity>0) qDebug() <<
"Error opening the selected file:" << filename <<
"or .." << filename.toLatin1().data();
1163 eOipv4addr_t ipv4 = 0;
1164 eObrd_ethtype_t type = eobrd_ethtype_none;
1173 *resultString = QString(
"%1").arg(result.c_str());
1216 QSet<QPair<int, int>> addresses_set;
1217 for (
const auto& addr : addresses) {
1218 addresses_set.insert(qMakePair(addr.first, addr.second));
1227 QMutexLocker locker(&mutex);
1228 QList<sBoard> result;
eOipv4addr_t acetoipv4(ACE_UINT32 address)
ACE_UINT32 ipv4toace(eOipv4addr_t ipv4)
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)
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)
EthBoardList getEthBoardList()
QList< QPair< QString, QVariant > > getDevices()
void updateProgress(float)
void bootFromApplication()
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)
QStringList getDevicesName()
bool uploadEthApplication(QString filename, QString *resultString)
bool uploadLoader(QString filename, QString *resultString)
bool init(Searchable &config, int port, QString address, int VerbositY)
cDownloader * getDownloader()
bool setVerbosity(int verb)
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)
int download_file(int bus, int board_pid, int download_type, bool eeprom)
FirmwareUpdaterCore * self
static void updateProgressCallback(float fraction)
#define DEFAULT_IP_ADDRESS