fp@1126: /***************************************************************************** fp@1126: * fp@1126: * $Id$ fp@1126: * fp@1126: ****************************************************************************/ fp@1126: fp@1126: #include fp@1126: #include fp@1126: using namespace std; fp@1126: fp@1126: #include "globals.h" fp@1126: fp@1126: /*****************************************************************************/ fp@1126: fp@1126: const char *help_domains = fp@1126: "[OPTIONS]\n" fp@1126: "\n" fp@1130: "Show information about the application's configured domains.\n" fp@1126: "\n" fp@1130: "Without the --verbose option, one domain is displayed per line.\n" fp@1130: "Example:\n" fp@1130: "\n" fp@1130: "Domain0: LogBaseAddr 0x00000000, Size 6, WorkingCounter 0/1\n" fp@1130: "\n" fp@1130: "The domain's base address for the logical datagram (LRD/LWR/LRW)\n" fp@1130: "is displayed followed by the domain's process data size in byte.\n" fp@1130: "The last values are the current datagram working counter sum and\n" fp@1130: "the expected working counter sum. If the values are equal, all\n" fp@1130: "Pdos are exchanged.\n" fp@1130: "\n" fp@1130: "If the --verbose option is given, the participating slave\n" fp@1130: "configurations/FMMUs and the current process data are additionally\n" fp@1130: "displayed:\n" fp@1130: "\n" fp@1130: "Domain1: LogBaseAddr 0x00000006, Size 6, WorkingCounter 0/1\n" fp@1130: " SlaveConfig 1001:0, SM3 ( Input), LogAddr 0x00000006, Size 6\n" fp@1130: " 00 00 00 00 00 00\n" fp@1130: "\n" fp@1130: "The process data are displayed as raw hexadecimal bytes.\n" fp@1130: "\n" fp@1130: "Command-specific options:\n" fp@1133: " --domain -d Positive numerical domain index, or 'all'\n" fp@1133: " for all domains (default).\n" fp@1133: " --verbose -v Show FMMUs and process data additionally.\n"; fp@1126: fp@1126: /****************************************************************************/ fp@1126: fp@1126: void showDomain(unsigned int); fp@1126: fp@1126: /****************************************************************************/ fp@1126: fp@1126: void command_domains(void) fp@1126: { fp@1126: masterDev.open(MasterDevice::Read); fp@1126: fp@1126: if (domainIndex == -1) { fp@1126: unsigned int i; fp@1126: ec_ioctl_master_t master; fp@1126: fp@1126: masterDev.getMaster(&master); fp@1126: fp@1126: for (i = 0; i < master.domain_count; i++) { fp@1126: showDomain(i); fp@1126: } fp@1126: } else { fp@1126: showDomain(domainIndex); fp@1126: } fp@1126: } fp@1126: fp@1126: /****************************************************************************/ fp@1126: fp@1126: void showDomain(unsigned int domainIndex) fp@1126: { fp@1126: ec_ioctl_domain_t domain; fp@1126: unsigned char *processData; fp@1126: ec_ioctl_domain_data_t data; fp@1126: unsigned int i, j; fp@1126: ec_ioctl_domain_fmmu_t fmmu; fp@1126: unsigned int dataOffset; fp@1126: fp@1126: masterDev.getDomain(&domain, domainIndex); fp@1126: fp@1126: cout << "Domain" << dec << domainIndex << ":" fp@1126: << " LogBaseAddr 0x" fp@1126: << hex << setfill('0') fp@1126: << setw(8) << domain.logical_base_address fp@1126: << ", Size " << dec << setfill(' ') fp@1126: << setw(3) << domain.data_size fp@1126: << ", WorkingCounter " fp@1126: << domain.working_counter << "/" fp@1126: << domain.expected_working_counter << endl; fp@1126: fp@1126: if (!domain.data_size || verbosity != Verbose) fp@1126: return; fp@1126: fp@1126: processData = new unsigned char[domain.data_size]; fp@1126: fp@1126: try { fp@1126: masterDev.getData(&data, domainIndex, domain.data_size, processData); fp@1126: } catch (MasterDeviceException &e) { fp@1126: delete [] processData; fp@1126: throw e; fp@1126: } fp@1126: fp@1126: for (i = 0; i < domain.fmmu_count; i++) { fp@1126: masterDev.getFmmu(&fmmu, domainIndex, i); fp@1126: fp@1126: cout << " SlaveConfig " fp@1126: << dec << fmmu.slave_config_alias fp@1126: << ":" << fmmu.slave_config_position fp@1126: << ", SM" << (unsigned int) fmmu.sync_index << " (" fp@1126: << setfill(' ') << setw(6) fp@1126: << (fmmu.dir == EC_DIR_INPUT ? "Input" : "Output") fp@1126: << "), LogAddr 0x" fp@1126: << hex << setfill('0') fp@1126: << setw(8) << fmmu.logical_address fp@1126: << ", Size " << dec << fmmu.data_size << endl; fp@1126: fp@1126: dataOffset = fmmu.logical_address - domain.logical_base_address; fp@1126: if (dataOffset + fmmu.data_size > domain.data_size) { fp@1126: stringstream err; fp@1126: err << "Fmmu information corrupted!"; fp@1126: delete [] processData; fp@1126: throw MasterDeviceException(err.str()); fp@1126: } fp@1126: fp@1126: cout << " " << hex << setfill('0'); fp@1126: for (j = 0; j < fmmu.data_size; j++) { fp@1126: if (j && !(j % BreakAfterBytes)) fp@1126: cout << endl << " "; fp@1126: cout << setw(2) fp@1126: << (unsigned int) *(processData + dataOffset + j) << " "; fp@1126: } fp@1126: cout << endl; fp@1126: } fp@1126: fp@1126: delete [] processData; fp@1126: } fp@1126: fp@1126: /*****************************************************************************/