QString AxisHandler::description()
{
    QString addressesW(""), addressesR(""), addressesS(""), addressesG("");

    for(int i=0; i<assignedWriteRegisters_.size(); ++i)
    {
        addressesW += QString::number(getRegister(i, regType::write));
        if(i < assignedWriteRegisters_.size()-1)
            addressesW += ",";
    }

    for(int i=0; i<assignedReadRegisters_.size(); ++i)
    {
        addressesR += QString::number(getRegister(i, regType::read));
        if(i < assignedReadRegisters_.size()-1)
            addressesR += ",";
    }

    for(int i=0; i<assignedSpeedRegisters_.size(); ++i)
    {
        addressesS += QString::number(getRegister(i, regType::speed));
        if(i < assignedSpeedRegisters_.size()-1)
            addressesS += ",";
    }

    for(int i=0; i<assignedGearRegisters_.size(); ++i)
    {
        addressesG += QString::number(getRegister(i, regType::gear));
        if(i < assignedGearRegisters_.size()-1)
            addressesG += ",";
    }

    return QString(handlerType())+"/"+QString::number(axesCount_)+"/"+addressesW+"/"+addressesR+"/"+addressesS+"/"+addressesG;
}
Foam::fileOperations::autoParallelFileOperation::
autoParallelFileOperation
(
    const bool verbose
)
:
    uncollatedFileOperation(false)
{
    // Determine the underlying file handler
    word handlerType(getEnv("FOAM_FILEHANDLER"));
    if (handlerType == type())
    {
        handlerType = word::null;
    }
    if (handlerType.empty())
    {
        handlerType = fileOperation::defaultFileHandler;
    }

    if (verbose)
    {
        Info<< "I/O    : " << typeName << nl
            << "         (reconstructs on-the-fly in parallel operation)" << nl
            << "         Underlying I/O through " << handlerType
            << endl;
    }

    if (regIOobject::fileModificationChecking == regIOobject::timeStampMaster)
    {
        if (verbose)
        {
            WarningInFunction
                << "Resetting fileModificationChecking to timeStamp" << endl;
        }
        regIOobject::fileModificationChecking = regIOobject::timeStamp;
    }
    else if
    (
        regIOobject::fileModificationChecking
     == regIOobject::inotifyMaster
    )
    {
        if (verbose)
        {
            WarningInFunction
                << "Resetting fileModificationChecking to inotify"
                << endl;
        }
        regIOobject::fileModificationChecking = regIOobject::inotify;
    }

    // Construct basic file handler
    basicFileHandler_ = fileOperation::New(handlerType, true);
}
void AxisHandler::set(QStringList frame)
{
    ModbusCommand* cmd;
    QStringList context = QStringList() << QString(handlerType());
    bool ok = false;

    if(frame.at(0) == QString("*")) // (S,A,*,...)
    {
        if(frame.length() == axesCount_+1)  // (S,A,*,pierwsza,druga,...)
        {
            context << QString("*");
            ok = true;
            QVector<int> values;

            for(int i=1; i<=axesCount_; ++i)
                values.push_back(frame.at(i).toInt());
            //rejestr kroków
            cmd = new ModbusCommandMultiwrite(context, getRegister(0, regType::write), axesCount_, values);
        }
        else
        {
            emit error("A/1/Arguments count not valid. Required " + QString::number(axesCount_+1) + \
                       ", given " + QString::number(frame.length()));
            return;
        }
    }
    else if(frame.at(0) == QString("s"))    // (S,A,s,...)
    {
        context << QString("s");
        if(frame.at(1) == QString("*")) // (S,A,s,*,...)
        {
            if(frame.length() == axesCount_+2)  // (S,A,s,*,piersza,druga,...)
            {
                context << QString("*");
                ok = true;
                QVector<int> values;

                for(int i=2; i<axesCount_+2; ++i)
                    values.push_back(frame.at(i).toInt());
                //rejestr prędkości
                cmd = new ModbusCommandMultiwrite(context, getRegister(0, regType::speed), axesCount_, values);
            }
            else
            {
                emit error("A/1/Arguments count not valid. Required 3 or " + QString::number(axesCount_+2) + \
                           ", given " + QString::number(frame.length()));
                return;
            }
        }
        else if(frame.length() == 3)    // (S,A,s,nr,wartość)
        {
            ok = true;
            //rejestr prędkości
            cmd = new ModbusCommandWrite(context, getRegister(frame.at(1).toInt(), regType::speed), frame.at(2).toInt());
        }
        else
        {
            emit error("A/1/Not enough arguments to set all axes' speed at once");
            return;
        }
    }
    else if(frame.at(0) == QString("g"))    // (S,A,g,...)
    {
        context << QString("g");
        if(frame.at(1) == QString("*")) // (S,A,g,*,...)
        {
            if(frame.length() == axesCount_+2)  // (S,A,g,*,piersza,druga,...)
            {
                context << QString("*");
                ok = true;
                QVector<int> values;

                for(int i=2; i<axesCount_+2; ++i)
                    values.push_back(frame.at(i).toInt());
                //rejestr prędkości
                cmd = new ModbusCommandMultiwrite(context, getRegister(0, regType::gear), axesCount_, values);
            }
            else
            {
                emit error("A/1/Arguments count not valid. Required 3 or " + QString::number(axesCount_+2) + \
                           ", given " + QString::number(frame.length()));
                return;
            }
        }
        else if(frame.length() == 3)    // (S,A,g,nr,wartość)
        {
            ok = true;
            //rejestr prędkości
            cmd = new ModbusCommandWrite(context, getRegister(frame.at(1).toInt(), regType::gear), frame.at(2).toInt());
        }
        else
        {
            emit error("A/1/Not enough arguments to set all axes' gear at once");
            return;
        }
    }
    else if(frame.length() == 2)    // (S,A,nr,wartość)
    {
        ok = true;
        //rejestr kroków
        cmd = new ModbusCommandWrite(context, getRegister(frame.at(0).toInt(), regType::write), frame.at(1).toInt());
    }
    else
        emit error("A/1/Arguments count not valid. Required 2 or " + QString::number(axesCount_+1) + \
                   " (+1 for speed), given " + QString::number(frame.length()));

    if(ok)
    {
        connect(cmd, SIGNAL(done(QStringList,QStringList)), this, SLOT(finish(QStringList,QStringList)));
        connect(cmd, SIGNAL(error(QString)), this, SLOT(failure(QString)));
        modbus_->addCommand(cmd);
    }
}
void AxisHandler::get(QStringList frame)
{
    QStringList context = QStringList() << QString(handlerType()) << frame.at(0);
    ModbusCommand* cmd;
    bool ok = false;

    if(frame.length() == 1)
    {
        if(frame.at(0) == QString("*"))
        {
            cmd = new ModbusCommandMultiread(context, getRegister(0, regType::read), axesCount_);
        }
        else
        {
            cmd = new ModbusCommandRead(context, getRegister(frame.at(0).toInt(), regType::read));
        }
        ok = true;
    }
    else if(frame.length() == 2)
    {
        context << frame.at(1);

        if(frame.at(0) == QString("s"))
        {
            if(frame.at(1) == QString("*"))
            {
                cmd = new ModbusCommandMultiread(context, getRegister(0, regType::speed), axesCount_);
                ok = true;
            }
            else
            {
                cmd = new ModbusCommandRead(context, getRegister(frame.at(1).toInt(), regType::speed));
                ok = true;
            }
        }
        else if(frame.at(0) == QString("g"))
        {
            if(frame.at(1) == QString("*"))
            {
                cmd = new ModbusCommandMultiread(context, getRegister(0, regType::gear), axesCount_);
                ok = true;
            }
            else
            {
                cmd = new ModbusCommandRead(context, getRegister(frame.at(1).toInt(), regType::gear));
                ok = true;
            }
        }
        else
            emit error("A/2/Two arguments given, but first is not 's' nor 'g'");
    }
    else
        emit error("A/1/Arguments count not valid. Required 1 or 2, given "+QString::number(frame.length()));

    if(ok)
    {
        connect(cmd, SIGNAL(done(QStringList,QStringList)), this, SLOT(finish(QStringList,QStringList)));
        connect(cmd, SIGNAL(error(QString)), this, SLOT(failure(QString)));
        modbus_->addCommand(cmd);
    }
}