tool/CommandPdos.cpp
changeset 1142 59be91dfcbe1
child 1144 7dbfdd61812c
equal deleted inserted replaced
1141:7ffbca63fc72 1142:59be91dfcbe1
       
     1 /*****************************************************************************
       
     2  *
       
     3  * $Id$
       
     4  *
       
     5  ****************************************************************************/
       
     6 
       
     7 #include <iostream>
       
     8 #include <iomanip>
       
     9 using namespace std;
       
    10 
       
    11 #include "CommandPdos.h"
       
    12 
       
    13 /*****************************************************************************/
       
    14 
       
    15 CommandPdos::CommandPdos():
       
    16     Command("pdos", "List Sync managers, Pdo assignment and mapping.")
       
    17 {
       
    18 }
       
    19 
       
    20 /*****************************************************************************/
       
    21 
       
    22 string CommandPdos::helpString() const
       
    23 {
       
    24     stringstream str;
       
    25 
       
    26     str << getName() << " [OPTIONS]" << endl
       
    27     	<< endl
       
    28     	<< getBriefDescription() << endl
       
    29         << endl
       
    30     	<< "The information is displayed in three layers, which are" << endl
       
    31     	<< "indented accordingly:" << endl
       
    32     	<< endl
       
    33     	<< "1) Sync managers - Contains the sync manager information" << endl
       
    34     	<< "   from the SII: Index, physical start address, default" << endl
       
    35     	<< "   size (value from the SII), control register and enable" << endl
       
    36     	<< "   word. Example:" << endl
       
    37 		<< endl
       
    38     	<< "   SM3: PhysAddr 0x1100, DefaultSize 0, ControlRegister 0x20,"
       
    39 		<< "Enable 1" << endl
       
    40     	<< endl
       
    41     	<< "2) Assigned Pdos - Pdo direction, hexadecimal index and" << endl
       
    42 		<< "   -if available- the Pdo name. Example:" << endl
       
    43     	<< endl
       
    44     	<< "   TxPdo 0x1a00 \"Channel1\"" << endl
       
    45     	<< endl
       
    46     	<< "3) Mapped Pdo entries - Pdo entry index and subindex (both" << endl
       
    47     	<< "   hexadecimal), the length in bit and -if available- the" << endl
       
    48     	<< "   description. Example:" << endl
       
    49     	<< endl
       
    50     	<< "   Pdo entry 0x3101:01, 8 bit, \"Status\"" << endl
       
    51     	<< endl
       
    52     	<< "Note, that the displayed Pdo assignment and Pdo mapping" << endl
       
    53     	<< "information can either originate from the SII or from the" << endl
       
    54 		<< "CoE communication area." << endl
       
    55     	<< endl
       
    56     	<< "Command-specific options:" << endl
       
    57     	<< "  --slave -s <index>  Positive numerical ring position," << endl
       
    58     	<< "                      or 'all' forall slaves (default)." << endl
       
    59     	<< endl
       
    60 		<< numericInfo();
       
    61 
       
    62 	return str.str();
       
    63 }
       
    64 
       
    65 /****************************************************************************/
       
    66 
       
    67 void CommandPdos::execute(MasterDevice &m, const StringVector &args)
       
    68 {
       
    69     m.open(MasterDevice::Read);
       
    70 
       
    71     if (slavePosition == -1) {
       
    72         unsigned int numSlaves = m.slaveCount(), i;
       
    73 
       
    74         for (i = 0; i < numSlaves; i++) {
       
    75             listSlavePdos(m, i, true);
       
    76         }
       
    77     } else {
       
    78         listSlavePdos(m, slavePosition, false);
       
    79     }
       
    80 }
       
    81 
       
    82 /****************************************************************************/
       
    83 
       
    84 void CommandPdos::listSlavePdos(
       
    85 		MasterDevice &m,
       
    86 		uint16_t slavePosition,
       
    87 		bool withHeader
       
    88 		)
       
    89 {
       
    90     ec_ioctl_slave_t slave;
       
    91     ec_ioctl_slave_sync_t sync;
       
    92     ec_ioctl_slave_sync_pdo_t pdo;
       
    93     ec_ioctl_slave_sync_pdo_entry_t entry;
       
    94     unsigned int i, j, k;
       
    95     
       
    96     m.getSlave(&slave, slavePosition);
       
    97 
       
    98     if (withHeader)
       
    99         cout << "=== Slave " << slavePosition << " ===" << endl;
       
   100 
       
   101     for (i = 0; i < slave.sync_count; i++) {
       
   102         m.getSync(&sync, slavePosition, i);
       
   103 
       
   104         cout << "SM" << i << ":"
       
   105             << " PhysAddr 0x"
       
   106             << hex << setfill('0')
       
   107             << setw(4) << sync.physical_start_address
       
   108             << ", DefaultSize "
       
   109             << dec << setfill(' ') << setw(4) << sync.default_size
       
   110             << ", ControlRegister 0x"
       
   111             << hex << setfill('0') << setw(2)
       
   112             << (unsigned int) sync.control_register
       
   113             << ", Enable " << dec << (unsigned int) sync.enable
       
   114             << endl;
       
   115 
       
   116         for (j = 0; j < sync.pdo_count; j++) {
       
   117             m.getPdo(&pdo, slavePosition, i, j);
       
   118 
       
   119             cout << "  " << (sync.control_register & 0x04 ? "R" : "T")
       
   120                 << "xPdo 0x"
       
   121                 << hex << setfill('0')
       
   122                 << setw(4) << pdo.index
       
   123                 << " \"" << pdo.name << "\"" << endl;
       
   124 
       
   125             if (getVerbosity() == Quiet)
       
   126                 continue;
       
   127 
       
   128             for (k = 0; k < pdo.entry_count; k++) {
       
   129                 m.getPdoEntry(&entry, slavePosition, i, j, k);
       
   130 
       
   131                 cout << "    Pdo entry 0x"
       
   132                     << hex << setfill('0')
       
   133                     << setw(4) << entry.index
       
   134                     << ":" << setw(2) << (unsigned int) entry.subindex
       
   135                     << ", " << dec << (unsigned int) entry.bit_length
       
   136                     << " bit, \"" << entry.name << "\"" << endl;
       
   137             }
       
   138         }
       
   139     }
       
   140 }
       
   141 
       
   142 /*****************************************************************************/