tools/Master.cpp
changeset 950 8b00e63fff90
parent 949 e424c0074c67
child 951 dc84a0af63da
equal deleted inserted replaced
949:e424c0074c67 950:8b00e63fff90
   164     unsigned char *processData;
   164     unsigned char *processData;
   165     unsigned int i;
   165     unsigned int i;
   166     
   166     
   167     getDomain(&domain, domainIndex);
   167     getDomain(&domain, domainIndex);
   168 
   168 
       
   169     if (!domain.data_size)
       
   170         return;
       
   171 
   169     processData = new unsigned char[domain.data_size];
   172     processData = new unsigned char[domain.data_size];
   170 
   173 
   171     data.domain_index = domainIndex;
   174     try {
   172     data.data_size = domain.data_size;
   175         getData(&data, domainIndex, domain.data_size, processData);
   173     data.target = processData;
   176     } catch (MasterException &e) {
   174 
       
   175     if (ioctl(fd, EC_IOCTL_DATA, &data) < 0) {
       
   176         stringstream err;
       
   177         err << "Failed to get domain data: " << strerror(errno);
       
   178         delete [] processData;
   177         delete [] processData;
   179         throw MasterException(err.str());
   178         throw e;
   180     }
   179     }
   181 
   180 
   182     for (i = 0; i < data.data_size; i++)
   181     for (i = 0; i < data.data_size; i++)
   183         cout << processData[i];
   182         cout << processData[i];
   184     cout.flush();
   183     cout.flush();
   188 
   187 
   189 /****************************************************************************/
   188 /****************************************************************************/
   190 
   189 
   191 void Master::showDomain(unsigned int domainIndex)
   190 void Master::showDomain(unsigned int domainIndex)
   192 {
   191 {
   193     ec_ioctl_domain_t data;
   192     ec_ioctl_domain_t domain;
       
   193     unsigned char *processData;
       
   194     ec_ioctl_data_t data;
       
   195     unsigned int i, j;
       
   196     ec_ioctl_domain_fmmu_t fmmu;
       
   197     unsigned int dataOffset;
   194     
   198     
   195     getDomain(&data, domainIndex);
   199     getDomain(&domain, domainIndex);
   196 
   200 
   197 	cout << "Domain" << domainIndex << ":"
   201 	cout << "Domain" << domainIndex << ":"
   198 		<< " LogBaseAddr 0x"
   202 		<< " LogBaseAddr 0x"
   199 		<< hex << setfill('0') << setw(8) << data.logical_base_address
   203 		<< hex << setfill('0') << setw(8) << domain.logical_base_address
   200 		<< ", Size " << dec << data.data_size
   204 		<< ", Size " << dec << setfill(' ') << setw(3) << domain.data_size
   201 		<< ", WorkingCounter "
   205 		<< ", WorkingCounter "
   202 		<< dec << data.working_counter
   206 		<< dec << setw(3) << domain.working_counter
   203 		<< " of " << data.expected_working_counter
   207 		<< " of " << setw(3) << domain.expected_working_counter << endl;
   204 		<< endl;
   208 
       
   209     if (!domain.data_size)
       
   210         return;
       
   211 
       
   212     processData = new unsigned char[domain.data_size];
       
   213 
       
   214     try {
       
   215         getData(&data, domainIndex, domain.data_size, processData);
       
   216     } catch (MasterException &e) {
       
   217         delete [] processData;
       
   218         throw e;
       
   219     }
       
   220 
       
   221     for (i = 0; i < domain.fmmu_count; i++) {
       
   222         getFmmu(&fmmu, domainIndex, i);
       
   223 
       
   224         cout << "  " << (fmmu.fmmu_dir ? "Inputs" : "Outputs")
       
   225             << " from slave config " << fmmu.slave_config_alias
       
   226             << ":" << fmmu.slave_config_position
       
   227             << ", LogAddr 0x" 
       
   228             << hex << setfill('0') << setw(8) << fmmu.logical_address
       
   229             << ", Size "
       
   230             << dec << setfill(' ') << setw(3) << fmmu.data_size
       
   231             << endl;
       
   232 
       
   233         dataOffset = fmmu.logical_address - domain.logical_base_address;
       
   234         if (dataOffset + fmmu.data_size > domain.data_size) {
       
   235             stringstream err;
       
   236             err << "Fmmu information corrupted!";
       
   237             delete [] processData;
       
   238             throw MasterException(err.str());
       
   239         }
       
   240 
       
   241         cout << "    " << hex << setfill('0');
       
   242         for (j = 0; j < fmmu.data_size; j++) {
       
   243             cout << setw(2)
       
   244                 << (unsigned int) *(processData + dataOffset + j) << " ";
       
   245         }
       
   246         cout << endl;
       
   247     }
       
   248 
       
   249     delete [] processData;
   205 }
   250 }
   206 
   251 
   207 /****************************************************************************/
   252 /****************************************************************************/
   208 
   253 
   209 void Master::listSlavePdos(uint16_t slavePosition, bool printSlave)
   254 void Master::listSlavePdos(uint16_t slavePosition, bool printSlave)
   399     }
   444     }
   400 }
   445 }
   401 
   446 
   402 /****************************************************************************/
   447 /****************************************************************************/
   403 
   448 
       
   449 void Master::getData(ec_ioctl_data_t *data, unsigned int domainIndex,
       
   450         unsigned int dataSize, unsigned char *mem)
       
   451 {
       
   452     data->domain_index = domainIndex;
       
   453     data->data_size = dataSize;
       
   454     data->target = mem;
       
   455 
       
   456     if (ioctl(fd, EC_IOCTL_DATA, data) < 0) {
       
   457         stringstream err;
       
   458         err << "Failed to get domain data: " << strerror(errno);
       
   459         throw MasterException(err.str());
       
   460     }
       
   461 }
       
   462 
       
   463 /****************************************************************************/
       
   464 
   404 void Master::getSlave(ec_ioctl_slave_t *slave, uint16_t slaveIndex)
   465 void Master::getSlave(ec_ioctl_slave_t *slave, uint16_t slaveIndex)
   405 {
   466 {
   406     slave->position = slaveIndex;
   467     slave->position = slaveIndex;
   407 
   468 
   408     if (ioctl(fd, EC_IOCTL_SLAVE, slave)) {
   469     if (ioctl(fd, EC_IOCTL_SLAVE, slave)) {
   416     }
   477     }
   417 }
   478 }
   418 
   479 
   419 /****************************************************************************/
   480 /****************************************************************************/
   420 
   481 
       
   482 void Master::getFmmu(
       
   483         ec_ioctl_domain_fmmu_t *fmmu,
       
   484         unsigned int domainIndex,
       
   485         unsigned int fmmuIndex
       
   486         )
       
   487 {
       
   488     fmmu->domain_index = domainIndex;
       
   489     fmmu->fmmu_index = fmmuIndex;
       
   490 
       
   491     if (ioctl(fd, EC_IOCTL_DOMAIN_FMMU, fmmu)) {
       
   492         stringstream err;
       
   493         err << "Failed to get domain FMMU: ";
       
   494         if (errno == EINVAL)
       
   495             err << "Either domain " << domainIndex << " does not exist, "
       
   496                 << "or it contains less than " << (unsigned int) fmmuIndex + 1
       
   497                 << " FMMus!";
       
   498         else
       
   499             err << strerror(errno);
       
   500         throw MasterException(err.str());
       
   501     }
       
   502 }
       
   503 
       
   504 /****************************************************************************/
       
   505 
   421 void Master::getSync(
   506 void Master::getSync(
   422         ec_ioctl_sync_t *sync,
   507         ec_ioctl_sync_t *sync,
   423         uint16_t slaveIndex,
   508         uint16_t slaveIndex,
   424         uint8_t syncIndex
   509         uint8_t syncIndex
   425         )
   510         )
   430     if (ioctl(fd, EC_IOCTL_SYNC, sync)) {
   515     if (ioctl(fd, EC_IOCTL_SYNC, sync)) {
   431         stringstream err;
   516         stringstream err;
   432         err << "Failed to get sync manager: ";
   517         err << "Failed to get sync manager: ";
   433         if (errno == EINVAL)
   518         if (errno == EINVAL)
   434             err << "Either slave " << slaveIndex << " does not exist, "
   519             err << "Either slave " << slaveIndex << " does not exist, "
   435                 << "or contains less than " << (unsigned int) syncIndex + 1
   520                 << "or it contains less than " << (unsigned int) syncIndex + 1
   436                 << " sync managers!";
   521                 << " sync managers!";
   437         else
   522         else
   438             err << strerror(errno);
   523             err << strerror(errno);
   439         throw MasterException(err.str());
   524         throw MasterException(err.str());
   440     }
   525     }
   456     if (ioctl(fd, EC_IOCTL_PDO, pdo)) {
   541     if (ioctl(fd, EC_IOCTL_PDO, pdo)) {
   457         stringstream err;
   542         stringstream err;
   458         err << "Failed to get Pdo: ";
   543         err << "Failed to get Pdo: ";
   459         if (errno == EINVAL)
   544         if (errno == EINVAL)
   460             err << "Either slave " << slaveIndex << " does not exist, "
   545             err << "Either slave " << slaveIndex << " does not exist, "
   461                 << "or contains less than " << (unsigned int) syncIndex + 1
   546                 << "or it contains less than " << (unsigned int) syncIndex + 1
   462                 << " sync managers, or sync manager "
   547                 << " sync managers, or sync manager "
   463                 << (unsigned int) syncIndex << " contains less than "
   548                 << (unsigned int) syncIndex << " contains less than "
   464                 << pdoPos + 1 << " Pdos!" << endl;
   549                 << pdoPos + 1 << " Pdos!" << endl;
   465         else
   550         else
   466             err << strerror(errno);
   551             err << strerror(errno);
   486     if (ioctl(fd, EC_IOCTL_PDO_ENTRY, entry)) {
   571     if (ioctl(fd, EC_IOCTL_PDO_ENTRY, entry)) {
   487         stringstream err;
   572         stringstream err;
   488         err << "Failed to get Pdo entry: ";
   573         err << "Failed to get Pdo entry: ";
   489         if (errno == EINVAL)
   574         if (errno == EINVAL)
   490             err << "Either slave " << slaveIndex << " does not exist, "
   575             err << "Either slave " << slaveIndex << " does not exist, "
   491                 << "or contains less than " << (unsigned int) syncIndex + 1
   576                 << "or it contains less than " << (unsigned int) syncIndex + 1
   492                 << " sync managers, or sync manager "
   577                 << " sync managers, or sync manager "
   493                 << (unsigned int) syncIndex << " contains less than "
   578                 << (unsigned int) syncIndex << " contains less than "
   494                 << pdoPos + 1 << " Pdos, or the Pdo at position " << pdoPos
   579                 << pdoPos + 1 << " Pdos, or the Pdo at position " << pdoPos
   495                 << " contains less than " << (unsigned int) entryPos + 1
   580                 << " contains less than " << (unsigned int) entryPos + 1
   496                 << " entries!" << endl;
   581                 << " entries!" << endl;