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; |