fp@1126: /*****************************************************************************
fp@1126:  *
fp@1126:  * $Id$
fp@1126:  *
fp@1126:  ****************************************************************************/
fp@1126: 
fp@1126: #include <iostream>
fp@1126: #include <iomanip>
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@1137:     "Without the --verbose option, the domains are displayed one-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@1137:     "The process data are displayed as hexadecimal bytes.\n"
fp@1130:     "\n"
fp@1130:     "Command-specific options:\n"
fp@1133:     "  --domain   -d <index> Positive numerical domain index, or 'all'\n"
fp@1133:     "                        for all domains (default).\n"
fp@1137:     "  --verbose  -v         Show FMMUs and process data additionally.\n"
fp@1137:     "\n"
fp@1137:     "Numerical values can be specified either with decimal (no prefix),\n"
fp@1137:     "octal (prefix '0') or hexadecimal (prefix '0x') base.\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@1136:             delete [] processData;
fp@1126:             err << "Fmmu information corrupted!";
fp@1136:             throw CommandException(err);
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: /*****************************************************************************/