tool/CommandRegWrite.cpp
author Knud Baastrup <kba@deif.com>
Tue, 14 Apr 2015 10:12:55 -0400
changeset 2625 e25af8bd3957
parent 2589 2b9c78543663
permissions -rw-r--r--
Eoe mac address now derived from unique mac.
The EoE MAC address is now derived from the NIC part of the first global
unique MAC address of the linked list of available network interfaces or
otherwise the MAC address used by the EtherCAT master. The EoE MAC address
will get the format 02:NIC:NIC:NIC:RP:RP where NIC comes from the unique MAC
address (if available) and RP is the ring position of the EoE slave.
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*****************************************************************************
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
 *
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
 *  $Id$
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
 *
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
     5
 *  Copyright (C) 2006-2012  Florian Pose, Ingenieurgemeinschaft IgH
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
 *
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
 *  This file is part of the IgH EtherCAT Master.
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
 *
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
 *  The IgH EtherCAT Master is free software; you can redistribute it and/or
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
 *  modify it under the terms of the GNU General Public License version 2, as
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
 *  published by the Free Software Foundation.
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
 *
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
 *  The IgH EtherCAT Master is distributed in the hope that it will be useful,
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
 *  Public License for more details.
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
 *
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
 *  You should have received a copy of the GNU General Public License along
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
 *  with the IgH EtherCAT Master; if not, write to the Free Software
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
 *
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
 *  ---
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
 *
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
 *  The license mentioned above concerns the source code only. Using the
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
 *  EtherCAT technology and brand is only permitted in compliance with the
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
 *  industrial property and similar rights of Beckhoff Automation GmbH.
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
 *
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
 ****************************************************************************/
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
#include <iostream>
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
#include <iomanip>
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
#include <fstream>
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
using namespace std;
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
#include "CommandRegWrite.h"
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#include "sii_crc.h"
1826
ec6223c3b7ec Multi-master support for command-line tool. The --master option supports
Florian Pose <fp@igh-essen.com>
parents: 1804
diff changeset
    37
#include "MasterDevice.h"
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
/*****************************************************************************/
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
CommandRegWrite::CommandRegWrite():
1835
20748e9d2238 Sourced out data type handling into an own class.
Florian Pose <fp@igh-essen.com>
parents: 1826
diff changeset
    42
    Command("reg_write", "Write data to a slave's registers.")
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
{
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
}
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
/*****************************************************************************/
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
1968
4f682084c643 Implemented drive_no for command-line tool; binary base name is now a
Florian Pose <fp@igh-essen.com>
parents: 1870
diff changeset
    48
string CommandRegWrite::helpString(const string &binaryBaseName) const
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
{
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
    stringstream str;
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
1968
4f682084c643 Implemented drive_no for command-line tool; binary base name is now a
Florian Pose <fp@igh-essen.com>
parents: 1870
diff changeset
    52
    str << binaryBaseName << " " << getName()
4f682084c643 Implemented drive_no for command-line tool; binary base name is now a
Florian Pose <fp@igh-essen.com>
parents: 1870
diff changeset
    53
        << " [OPTIONS] <OFFSET> <DATA>" << endl
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
    54
        << endl
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
        << getBriefDescription() << endl
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
        << endl
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
        << "This command requires a single slave to be selected." << endl
1804
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
    58
        << endl
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
        << "Arguments:" << endl
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
    60
        << "  ADDRESS is the register address to write to." << endl
1389
5b392b22a2da reg_write with data types.
Florian Pose <fp@igh-essen.com>
parents: 1388
diff changeset
    61
        << "  DATA    depends on whether a datatype was specified" << endl
1804
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
    62
        << "          with the --type option: If not, DATA must be" << endl
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
    63
        << "          either a path to a file with data to write," << endl
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
    64
        << "          or '-', which means, that data are read from" << endl
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
    65
        << "          stdin. If a datatype was specified, VALUE is" << endl
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
    66
        << "          interpreted respective to the given type." << endl
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
        << endl
1868
489ea0becd74 Implemented SoE IDN parser for strings like 'P-0-0150'; moved data type
Florian Pose <fp@igh-essen.com>
parents: 1835
diff changeset
    68
        << typeInfo()
1804
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
    69
        << endl
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
        << "Command-specific options:" << endl
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
    71
        << "  --alias     -a <alias>" << endl
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
    72
        << "  --position  -p <pos>    Slave selection. See the help of"
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
    73
        << endl
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
    74
        << "                          the 'slaves' command." << endl
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
    75
        << "  --type      -t <type>   Data type (see above)." << endl
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
    76
        << "  --emergency -e          Send as emergency request." << endl
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
        << endl
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
        << numericInfo();
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
    return str.str();
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
}
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
/****************************************************************************/
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
1826
ec6223c3b7ec Multi-master support for command-line tool. The --master option supports
Florian Pose <fp@igh-essen.com>
parents: 1804
diff changeset
    85
void CommandRegWrite::execute(const StringVector &args)
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
{
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
    stringstream strOffset, err;
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
    88
    ec_ioctl_slave_reg_t io;
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
    ifstream file;
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
    if (args.size() != 2) {
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
        err << "'" << getName() << "' takes exactly two arguments!";
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
        throwInvalidUsageException(err);
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
    }
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
    95
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
    strOffset << args[0];
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
    strOffset
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
        >> resetiosflags(ios::basefield) // guess base from prefix
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
    99
        >> io.address;
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
    if (strOffset.fail()) {
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   101
        err << "Invalid address '" << args[0] << "'!";
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   102
        throwInvalidUsageException(err);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   103
    }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   104
1804
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   105
    if (getDataType().empty()) {
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   106
        if (args[1] == "-") {
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   107
            loadRegData(&io, cin);
1804
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   108
        } else {
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   109
            file.open(args[1].c_str(), ifstream::in | ifstream::binary);
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   110
            if (file.fail()) {
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   111
                err << "Failed to open '" << args[1] << "'!";
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   112
                throwCommandException(err);
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   113
            }
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   114
            loadRegData(&io, file);
1804
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   115
            file.close();
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   116
        }
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   117
    } else {
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   118
        stringstream strValue;
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   119
        const DataType *dataType = findDataType(getDataType());
1389
5b392b22a2da reg_write with data types.
Florian Pose <fp@igh-essen.com>
parents: 1388
diff changeset
   120
5b392b22a2da reg_write with data types.
Florian Pose <fp@igh-essen.com>
parents: 1388
diff changeset
   121
        if (!dataType) {
5b392b22a2da reg_write with data types.
Florian Pose <fp@igh-essen.com>
parents: 1388
diff changeset
   122
            err << "Invalid data type '" << getDataType() << "'!";
5b392b22a2da reg_write with data types.
Florian Pose <fp@igh-essen.com>
parents: 1388
diff changeset
   123
            throwInvalidUsageException(err);
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
        }
1389
5b392b22a2da reg_write with data types.
Florian Pose <fp@igh-essen.com>
parents: 1388
diff changeset
   125
1804
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   126
        if (dataType->byteSize) {
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   127
            io.size = dataType->byteSize;
1835
20748e9d2238 Sourced out data type handling into an own class.
Florian Pose <fp@igh-essen.com>
parents: 1826
diff changeset
   128
        } else {
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   129
            io.size = 1024; // FIXME
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   130
        }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   131
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   132
        io.data = new uint8_t[io.size];
1804
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   133
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   134
        try {
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   135
            io.size = interpretAsType(
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   136
                    dataType, args[1], io.data, io.size);
1835
20748e9d2238 Sourced out data type handling into an own class.
Florian Pose <fp@igh-essen.com>
parents: 1826
diff changeset
   137
        } catch (SizeException &e) {
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   138
            delete [] io.data;
1835
20748e9d2238 Sourced out data type handling into an own class.
Florian Pose <fp@igh-essen.com>
parents: 1826
diff changeset
   139
            throwCommandException(e.what());
1804
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   140
        } catch (ios::failure &e) {
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   141
            delete [] io.data;
1804
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   142
            err << "Invalid value argument '" << args[1]
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   143
                << "' for type '" << dataType->name << "'!";
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   144
            throwInvalidUsageException(err);
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   145
        }
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1431
diff changeset
   146
    }
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   148
    if ((uint32_t) io.address + io.size > 0xffff) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   149
        err << "Address and size exceeding 64k!";
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   150
        delete [] io.data;
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
        throwInvalidUsageException(err);
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
    }
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
1870
0cee1fb7f0fd Added getSingleMasterIndex() for command-line tool.
Florian Pose <fp@igh-essen.com>
parents: 1869
diff changeset
   154
    MasterDevice m(getSingleMasterIndex());
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
    try {
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
        m.open(MasterDevice::ReadWrite);
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
    } catch (MasterDeviceException &e) {
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   158
        delete [] io.data;
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
        throw e;
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
    }
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   162
    if (getEmergency()) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   163
        io.slave_position = emergencySlave();
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   164
        io.emergency = true;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   165
    }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   166
    else {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   167
        SlaveList slaves = selectedSlaves(m);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   168
        if (slaves.size() != 1) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   169
            delete [] io.data;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   170
            throwSingleSlaveRequired(slaves.size());
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   171
        }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   172
        io.slave_position = slaves.front().position;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   173
        io.emergency = false;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   174
    }
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
    // send data to master
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
    try {
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   178
        m.writeReg(&io);
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
    } catch (MasterDeviceException &e) {
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   180
        delete [] io.data;
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
        throw e;
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
    }
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
    if (getVerbosity() == Verbose) {
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
        cerr << "Register writing finished." << endl;
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
    }
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   188
    delete [] io.data;
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
}
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
/*****************************************************************************/
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
void CommandRegWrite::loadRegData(
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   194
        ec_ioctl_slave_reg_t *io,
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
        const istream &in
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
        )
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
{
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
    stringstream err;
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
    ostringstream tmp;
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
    tmp << in.rdbuf();
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
    string const &contents = tmp.str();
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
    if (getVerbosity() == Verbose) {
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
        cerr << "Read " << contents.size() << " bytes of data." << endl;
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
    }
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
    if (contents.size() > 0xffff) {
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
        err << "Invalid data size " << contents.size() << "!";
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
        throwInvalidUsageException(err);
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
    }
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   212
    io->size = contents.size();
1388
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
3c886ec376f5 Renamed phy_ commands to reg_.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
    // allocate buffer and read file into buffer
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   215
    io->data = new uint8_t[io->size];
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   216
    contents.copy((char *) io->data, contents.size());
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   217
}
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   218
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1968
diff changeset
   219
/*****************************************************************************/