Exemple #1
0
/// Creates an observer
int luaEvent::createObserver(lua_State *luaL)
{
    Reference<luaEvent>::getReference(luaL);

    // flags para a defini??o do uso de compress?o
    // na transmiss?o de datagramas e da visibilidade
    // dos observadores Udp Sender
    bool compressDatagram = false, obsVisible = true;

    int top = lua_gettop(luaL);
    int typeObserver =(int)luaL_checkinteger(luaL, 1);

    QStringList allAttribs, cols;

    allAttribs.push_back("EventTime");
    allAttribs.push_back("Periodicity");
    allAttribs.push_back("Priority");

    lua_pushnil(luaL);
    while (lua_next(luaL, top - 1) != 0)
    {
        QString key;
        if (lua_type(luaL, -2) == LUA_TSTRING)
            key = QString(luaL_checkstring(luaL, -2));

        switch (lua_type(luaL, -1))
        {
        case LUA_TSTRING:
            {
                QString value(luaL_checkstring(luaL, -1));
                cols.push_back(value);
                break;
            }

        case LUA_TBOOLEAN:
            {
                bool val = lua_toboolean(luaL, -1);
                if (key == "visible")
                    obsVisible = val;
                else // if (key == "compress")
                    compressDatagram = val;
            }
        default:
            break;
        }
        lua_pop(luaL, 1);
    }

    if (cols.isEmpty())
    {
        if (execModes != Quiet){
            string err_out = string("Warning: The parameter table is empty.");
            lua_getglobal(L, "customWarning");
            lua_pushstring(L, err_out.c_str());
            lua_pushnumber(L, 5);
            lua_call(L, 2, 0);
        }
        cols << "" << "";
    }

    ObserverTextScreen *obsText = 0;
    ObserverTable *obsTable = 0;
    ObserverLogFile *obsLog = 0;
    ObserverUDPSender *obsUDPSender = 0;

    int obsId = -1;

    switch (typeObserver)
    {
        case TObsTextScreen:
            obsText =(ObserverTextScreen*) EventSubjectInterf::createObserver(TObsTextScreen);
            if (obsText)
            {
                obsId = obsText->getId();
            }
            else
            {
                if (execModes != Quiet)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsLogFile:
            obsLog =(ObserverLogFile*) EventSubjectInterf::createObserver(TObsLogFile);
            if (obsLog)
            {
                obsId = obsLog->getId();
            }
            else
            {
                if (execModes != Quiet)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsTable:
            obsTable =(ObserverTable *) EventSubjectInterf::createObserver(TObsTable);
            if (obsTable)
            {
                obsId = obsTable->getId();
            }
            else
            {
                if (execModes != Quiet)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsUDPSender:
            obsUDPSender =(ObserverUDPSender *) EventSubjectInterf::createObserver(TObsUDPSender);
            if (obsUDPSender)
            {
                obsId = obsUDPSender->getId();
                obsUDPSender->setCompressDatagram(compressDatagram);

                if (obsVisible)
                    obsUDPSender->show();
            }
            else
            {
                if (execModes != Quiet)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        default:
            if (execModes != Quiet)
            {
                qWarning("Error: In this context, the code '%s' does not "
                    "correspond to a valid type of Observer.",  getObserverName(typeObserver));
            }
            return 0;
    }

    QStringList obsAttribs;
    obsAttribs = allAttribs;
    observedAttribs = allAttribs;

    if (obsLog)
    {
        obsLog->setAttributes(obsAttribs);

        if (cols.at(0).isNull() || cols.at(0).isEmpty())
        {
            obsLog->setFileName(DEFAULT_NAME + ".csv");
        }
        else
        {
            obsLog->setFileName(cols.at(0));
        }

        obsLog->setFileName(cols.at(0));

        // caso n?o seja definido, utiliza o default ";"
        if ((cols.size() < 2) || cols.at(1).isNull() || cols.at(1).isEmpty())
        {
            obsLog->setSeparator();
        }
        else
        {
            obsLog->setSeparator(cols.at(1));
        }

        lua_pushnumber(luaL, obsId);
        return 1;
    }

    if (obsText)
    {
        obsText->setAttributes(obsAttribs);

        lua_pushnumber(luaL, obsId);
        return 1;
    }

    if (obsTable)
    {
        obsTable->setColumnHeaders(cols);
        obsTable->setAttributes(obsAttribs);

        lua_pushnumber(luaL, obsId);
        return 1;
    }

    if (obsUDPSender)
    {
        obsUDPSender->setAttributes(obsAttribs);

        obsUDPSender->setPort(cols.at(0).toInt());

        // broadcast
        if ((cols.size() == 1) ||((cols.size() == 2) && cols.at(1).isEmpty()))
        {
            obsUDPSender->addHost(BROADCAST_HOST);
        }
        else
        {
            // multicast or unicast
            for (int i = 1; i < cols.size(); i++){
                if (!cols.at(i).isEmpty())
                    obsUDPSender->addHost(cols.at(i));
            }
        }
        lua_pushnumber(luaL, obsId);
        return 1;
    }
    return 0;
}
Exemple #2
0
/// Creates an observer
int luaEvent::createObserver( lua_State *L )
{
#ifdef DEBUG_OBSERVER
    stackDump(luaL);
#endif

    // recupero a referencia da celula
    lua_rawgeti(luaL, LUA_REGISTRYINDEX, ref);

    
    // flags para a definição do uso de compressão
    // na transmissão de datagramas e da visibilidade
    // dos observadores Udp Sender 
    bool compressDatagram = false, obsVisible = true;

    int top = lua_gettop(luaL);
    int typeObserver = (int)luaL_checkinteger(luaL, 1);

    QStringList allAttribs, cols;

    allAttribs.push_back("EventTime");
    allAttribs.push_back("Periodicity");
    allAttribs.push_back("Priority");

    // Recupera a tabela de parametros
    //if(! lua_istable(luaL, top - 1) )
    //{
    //    if (! QUIET_MODE )
    //        qWarning("Warning: Parameter table not found.");
    //}
    //else
    //{
    lua_pushnil(luaL);
    while(lua_next(luaL, top - 1) != 0)
    {   
        QString key;
        if (lua_type(luaL, -2) == LUA_TSTRING)
            key = QString( luaL_checkstring(luaL, -2));

        switch (lua_type(luaL, -1))
        {
        case LUA_TSTRING:
            {
                QString value( luaL_checkstring(luaL, -1));
                cols.push_back(value);
                break;
            }

        case LUA_TBOOLEAN:
            {
                bool val = lua_toboolean(luaL, -1);
                if (key == "visible")
                    obsVisible = val;
                else // if (key == "compress")
                    compressDatagram = val;
            }
        default:
            break;
        }
        lua_pop(luaL, 1);
    }
    // }

    if (cols.isEmpty())
    {
        if (! QUIET_MODE )
            qWarning("Warning: The Parameters Table is empty.");
        cols << "" << "";
    }

    ObserverTextScreen *obsText = 0;
    ObserverTable *obsTable = 0;
    ObserverLogFile *obsLog = 0;
    ObserverUDPSender *obsUDPSender = 0;

    int obsId = -1;

    switch (typeObserver)
    {
        case TObsTextScreen:
            obsText = (ObserverTextScreen*) EventSubjectInterf::createObserver(TObsTextScreen);
            if (obsText)
            {
                obsId = obsText->getId();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", TerraMEObserver::MEMORY_ALLOC_FAILED);
            }
            break;

        case TObsLogFile:
            obsLog = (ObserverLogFile*) EventSubjectInterf::createObserver(TObsLogFile);
            if (obsLog)
            {
                obsId = obsLog->getId();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", TerraMEObserver::MEMORY_ALLOC_FAILED);
            }
            break;

        case TObsTable:
            obsTable = (ObserverTable *) EventSubjectInterf::createObserver(TObsTable);
            if (obsTable)
            {
                obsId = obsTable->getId();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", TerraMEObserver::MEMORY_ALLOC_FAILED);
            }
            break;

        case TObsUDPSender:
            obsUDPSender = (ObserverUDPSender *) EventSubjectInterf::createObserver(TObsUDPSender);
            if (obsUDPSender)
            {
                obsId = obsUDPSender->getId();
                obsUDPSender->setCompressDatagram(compressDatagram);

                if (obsVisible)
                    obsUDPSender->show();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", TerraMEObserver::MEMORY_ALLOC_FAILED);
            }
            break;

        default:
            if (! QUIET_MODE )
            {
                qWarning("Error: In this context, the code '%s' does not "
                    "correspond to a valid type of Observer.",  getObserverName(typeObserver) );
            }
            return 0;
    }

    QStringList obsAttribs;
    obsAttribs = allAttribs;
    observedAttribs = allAttribs;

    /// Define alguns parametros do observador instanciado ---------------------------------------------------

    if (obsLog)
    {
        obsLog->setHeaders(obsAttribs);

        if (cols.at(0).isNull() || cols.at(0).isEmpty())
        {
            if (! QUIET_MODE )
            {
                qWarning("Warning: Filename was not specified, using a "
                    "default \"%s\".", qPrintable(DEFAULT_NAME));
            }
            obsLog->setFileName(DEFAULT_NAME + ".csv");
        }
        else
        {
            obsLog->setFileName(cols.at(0));
        }

        // caso não seja definido, utiliza o default ";"
        if ((cols.size() < 2) || cols.at(1).isNull() || cols.at(1).isEmpty())
        {
            if (! QUIET_MODE )
                qWarning("Warning: Separator not defined, using \";\".");
            obsLog->setSeparator();
        }
        else
        {
            obsLog->setSeparator(cols.at(1));
        }
        lua_pushnumber(luaL, obsId);
        return 1;
    }

    if (obsText)
    {
        obsText->setHeaders(obsAttribs);

        lua_pushnumber(luaL, obsId);
        return 1;
    }

    if (obsTable)
    {
        if ((cols.size() < 1) || (cols.size() < 2) || cols.at(0).isNull() || cols.at(0).isEmpty()
                || cols.at(1).isNull() || cols.at(1).isEmpty())
        {
            if (! QUIET_MODE )
                qWarning("Warning: Column title not defined.");
        }
        obsTable->setColumnHeaders(cols);
        obsTable->setLinesHeader(obsAttribs);

        lua_pushnumber(luaL, obsId);
        return 1;
    }

    if (obsUDPSender)
    {
        obsUDPSender->setAttributes(obsAttribs);

        if (cols.isEmpty())
        {
            if (! QUIET_MODE )
                qWarning("Warning: Port not defined.");
        }
        else
        {
            obsUDPSender->setPort(cols.at(0).toInt());
        }

        // broadcast
        if ((cols.size() == 1) || ((cols.size() == 2) && cols.at(1).isEmpty()) )
        {
            if (! QUIET_MODE )
                qWarning("Warning: Observer will send to broadcast.");
            obsUDPSender->addHost(BROADCAST_HOST);
        }
        else
        {
            // multicast or unicast
            for(int i = 1; i < cols.size(); i++){
                if (! cols.at(i).isEmpty())
                    obsUDPSender->addHost(cols.at(i));
            }
        }
        lua_pushnumber(luaL, obsId);
        return 1;
    }
    return 0;
}
int luaTrajectory::createObserver( lua_State *L )
{

#ifdef DEBUG_OBSERVER
    luaStackToQString(7);
#endif

    // recupero a referencia da celula
    lua_rawgeti(luaL, LUA_REGISTRYINDEX, ref);

    // flags para a definição do uso de compressão
    // na transmissão de datagramas e da visibilidade
    // dos observadores Udp Sender
    bool compressDatagram = false, obsVisible = true;

    // recupero a tabela de atributos da celula
    int top = lua_gettop(luaL);

    // Não modifica em nada a pilha recupera o enum referente ao tipo
    // do observer
    int typeObserver = (int)luaL_checkinteger(luaL, 1);

    if ((typeObserver !=  TObsMap) && (typeObserver !=  TObsImage))
    {
        QStringList allAttribs, obsAttribs, obsParams, cols;

        // qDebug() << "Recupera a tabela de parametros";
        lua_pushnil(luaL);
        while(lua_next(luaL, top - 1) != 0)
        {
            QString key;

            if (lua_type(luaL, -2) == LUA_TSTRING)
            {
                key = luaL_checkstring(luaL, -2);
            }
            //else
            //{
            //    if (lua_type(luaL, -2) == LUA_TNUMBER)
            //    {
            //        char aux[100];
            //        double number = luaL_checknumber(luaL, -2);
            //        sprintf(aux, "%g", number);
            //        key = aux;
            //    }
            //}

            switch (lua_type(luaL, -1))
            {
            case LUA_TBOOLEAN:
            {
                bool val = lua_toboolean(luaL, -1);
                if (key == "visible")
                    obsVisible = val;
                else // if (key == "compress")
                    compressDatagram = val;
                break;
            }

            case LUA_TSTRING:
            {
                const char *strAux = luaL_checkstring(luaL, -1);
                cols.append(strAux);
                break;
            }
            case LUA_TTABLE:
            {
                int pos = lua_gettop(luaL);
                QString k;

                lua_pushnil(luaL);
                while(lua_next(luaL, pos) != 0)
                {

                    if (lua_type(luaL, -2) == LUA_TSTRING)
                    {
                        obsParams.append( luaL_checkstring(luaL, -2) );
                    }

                    switch (lua_type(luaL, -1))
                    {
                    case LUA_TSTRING:
                        k = QString(luaL_checkstring(luaL, -1));
                        break;

                    case LUA_TNUMBER:
                    {
                        char aux[100];
                        double number = luaL_checknumber(luaL, -1);
                        sprintf(aux, "%g", number);
                        k = QString(aux);
                        break;
                    }
                    default:
                        break;
                    }
                    cols.append(k);
                    lua_pop(luaL, 1);
                }
                break;
            }
            default:
                break;
            }
            lua_pop(luaL, 1);
        }

        // qDebug() << "Recupera a tabela de atributos";
        lua_pushnil(luaL);
        while(lua_next(luaL, top - 2) != 0)
        {
            if (lua_type(luaL, -1) == LUA_TSTRING)
            {
                // QString key( luaL_checkstring(luaL, -1) );
                obsAttribs.push_back(luaL_checkstring(luaL, -1));
            }
            lua_pop(luaL, 1);
        }

        // Retrieves all subject attributes
        lua_pushnil(luaL);
        while(lua_next(luaL, top) != 0)
        {
            if (lua_type(luaL, -2) == LUA_TSTRING)
                allAttribs.append( luaL_checkstring(luaL, -2) );
            lua_pop(luaL, 1);
        }

        if (obsAttribs.empty())
        {
            obsAttribs = allAttribs;
            observedAttribs = allAttribs;
        }
        else
        {
            // Verifica se o atributo informado realmente existe na celula
            for (int i = 0; i < obsAttribs.size(); i++)
            {
                if (! observedAttribs.contains(obsAttribs.at(i)) )
                    observedAttribs.push_back(obsAttribs.at(i));

                if (! allAttribs.contains(obsAttribs.at(i)))
                {
                    qFatal("\nError: Attribute name '%s' not found.\n",
                           qPrintable(obsAttribs.at(i)) );
                    return -1;
                }
            }
        }

        ObserverTextScreen *obsText = 0;
        ObserverTable *obsTable = 0;
        ObserverGraphic *obsGraphic = 0;
        ObserverLogFile *obsLog = 0;
        ObserverUDPSender *obsUDPSender = 0;
        int obsId = -1;

        switch (typeObserver)
        {
        case TObsTextScreen:
            obsText = (ObserverTextScreen*)
                      TrajectorySubjectInterf::createObserver(TObsTextScreen);
            if (obsText)
            {
                obsId = obsText->getId();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsLogFile:
            obsLog = (ObserverLogFile*)
                     TrajectorySubjectInterf::createObserver(TObsLogFile);
            if (obsLog)
            {
                obsId = obsLog->getId();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsTable:
            obsTable = (ObserverTable *)
                       TrajectorySubjectInterf::createObserver(TObsTable);
            if (obsTable)
            {
                obsId = obsTable->getId();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsDynamicGraphic:
            obsGraphic = (ObserverGraphic *)
                         TrajectorySubjectInterf::createObserver(TObsDynamicGraphic);
            if (obsGraphic)
            {
                obsGraphic->setObserverType(TObsDynamicGraphic);
                obsId = obsGraphic->getId();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsGraphic:
            obsGraphic = (ObserverGraphic *)
                         TrajectorySubjectInterf::createObserver(TObsGraphic);
            if (obsGraphic)
            {
                obsId = obsGraphic->getId();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsUDPSender:
            obsUDPSender = (ObserverUDPSender *)
                           TrajectorySubjectInterf::createObserver(TObsUDPSender);
            if (obsUDPSender)
            {
                obsId = obsUDPSender->getId();
                obsUDPSender->setCompressDatagram(compressDatagram);

                if (obsVisible)
                    obsUDPSender->show();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        default:
            if (! QUIET_MODE )
            {
                qWarning("Warning: In this context, the code '%s' does not correspond to a "
                         "valid type of Observer.",  getObserverName(typeObserver) );
            }
            return 0;
        }

#ifdef DEBUG_OBSERVER
        qDebug() << "obsParams: " << obsParams;
        qDebug() << "\nobsAttribs: " << obsAttribs;
        qDebug() << "\nallAttribs: " << allAttribs;
        qDebug() << "\ncols: " << cols;
#endif

        if (obsLog)
        {
            obsLog->setAttributes(obsAttribs);

            if (cols.at(0).isNull() || cols.at(0).isEmpty())
            {
                if (! QUIET_MODE )
                    qWarning("Warning: Filename was not specified, using a "
                             "default \"%s\".", qPrintable(DEFAULT_NAME));
                obsLog->setFileName(DEFAULT_NAME + ".csv");
            }
            else
            {
                obsLog->setFileName(cols.at(0));
            }

            // caso não seja definido, utiliza o default ";"
            if ((cols.size() < 2) || cols.at(1).isNull() || cols.at(1).isEmpty())
            {
                if (! QUIET_MODE )
                    qWarning("Warning: Separator not defined, using \";\".");
                obsLog->setSeparator();
            }
            else
            {
                obsLog->setSeparator(cols.at(1));
            }

            lua_pushnumber(luaL, obsId);
            return 1;
        }

        if (obsText)
        {
            obsText->setAttributes(obsAttribs);
            lua_pushnumber(luaL, obsId);
            return 1;
        }

        if (obsTable)
        {
            if ((cols.size() < 2) || cols.at(0).isNull() || cols.at(0).isEmpty()
                    || cols.at(1).isNull() || cols.at(1).isEmpty())
            {
                if (! QUIET_MODE )
                    qWarning("Warning: Column title not defined.");
            }

            obsTable->setColumnHeaders(cols);
            obsTable->setAttributes(obsAttribs);

            lua_pushnumber(luaL, obsId);
            return 1;
        }

        if (obsGraphic)
        {
            obsGraphic->setLegendPosition();

            // Takes titles of three first locations
            obsGraphic->setTitles(cols.at(0), cols.at(1), cols.at(2));
            cols.removeFirst(); // remove graphic title
            cols.removeFirst(); // remove axis x title
            cols.removeFirst(); // remove axis y title

            // Splits the attribute labels in the cols list
            obsGraphic->setAttributes(obsAttribs, cols.takeFirst().split(";", QString::SkipEmptyParts),
                                      obsParams, cols);

            lua_pushnumber(luaL, obsId);
            return 1;
        }

        if(obsUDPSender)
        {
            obsUDPSender->setAttributes(obsAttribs);

            // if (cols.at(0).isEmpty())
            if (cols.isEmpty())
            {
                if (! QUIET_MODE )
                    qWarning("Warning: Port not defined.");
            }
            else
            {
                obsUDPSender->setPort(cols.at(0).toInt());
            }

            // broadcast
            if ((cols.size() == 1) || ((cols.size() == 2) && cols.at(1).isEmpty()) )
            {
                if (! QUIET_MODE )
                    qWarning("Warning: Observer will send to broadcast.");
                obsUDPSender->addHost(BROADCAST_HOST);
            }
            else
            {
                // multicast or unicast
                for(int i = 1; i < cols.size(); i++)
                {
                    if (! cols.at(i).isEmpty())
                        obsUDPSender->addHost(cols.at(i));
                }
            }
            lua_pushnumber(luaL, obsId);
            return 1;
        }
    }
    //   ((typeObserver !=  TObsMap) && (typeObserver !=  TObsImage))
    // Creation of spatial observers
    else
    {
        QStringList obsParams, obsParamsAtribs; // parametros/atributos da legenda

        bool getObserverId = false, isLegend = false;
        int obsId = -1;

        AgentObserverMap *obsMap = 0;
        AgentObserverImage *obsImage = 0;

        // Recupera os parametros
        lua_pushnil(luaL);
        while(lua_next(luaL, top - 1) != 0)
        {
            // Recupera o ID do observer map
            if ( (lua_isnumber(luaL, -1) && (! getObserverId)) )
            {
                obsId = luaL_checknumber(luaL, -1);
                getObserverId = true;
                isLegend = true;
            }

            // recupera o espao celular
            if (lua_istable(luaL, -1))
            {
                int paramTop = lua_gettop(luaL);

                lua_pushnil(luaL);
                while(lua_next(luaL, paramTop) != 0)
                {
                    if (isudatatype(luaL, -1, "TeCellularSpace"))
                    {
                        cellSpace = Luna<luaCellularSpace>::check(L, -1);
                    }
                    else
                    {
                        if (isLegend)
                        {
                            QString key = luaL_checkstring(luaL, -2);

                            obsParams.push_back(key);

                            bool boolAux;
                            double numAux;
                            QString strAux;

                            switch( lua_type(luaL, -1) )
                            {
                            case LUA_TBOOLEAN:
                                boolAux = lua_toboolean(luaL, -1);
                                break;

                            case LUA_TNUMBER:
                                numAux = luaL_checknumber(luaL, -1);
                                obsParamsAtribs.push_back(QString::number(numAux));
                                break;

                            case LUA_TSTRING:
                                strAux = luaL_checkstring(luaL, -1);
                                obsParamsAtribs.push_back(QString(strAux));
                                break;

                            default:
                                break;
                            }
                        } // isLegend
                    }
                    lua_pop(luaL, 1);
                }
            }
            lua_pop(luaL, 1);
        }

        QString errorMsg = QString("\nError: The Observer ID \"%1\" was not found. "
                                   "Check the declaration of this observer.\n").arg(obsId);

        if (! cellSpace)
            qFatal("%s", qPrintable(errorMsg));

        if (typeObserver == TObsMap)
        {
            obsMap = (AgentObserverMap *)cellSpace->getObserver(obsId);

            if (! obsMap)
                qFatal("%s", qPrintable(errorMsg));

            obsMap->registry(this);
        }
        else
        {
            obsImage = (AgentObserverImage *)cellSpace->getObserver(obsId);

            if (! obsImage)
                qFatal("%s", qPrintable(errorMsg));

            obsImage->registry(this);
        }

        QStringList allAttribs, obsAttribs;

        // Recupera os atributos
        lua_pushnil(luaL);
        while(lua_next(luaL, top - 2) != 0)
        {
            const char * key = luaL_checkstring(luaL, -1);
            obsAttribs.push_back(QString(key));
            lua_pop(luaL, 1);
        }

        for(int i = 0; i < obsAttribs.size(); i++)
        {
            if (! observedAttribs.contains(obsAttribs.at(i)) )
                observedAttribs.push_back(obsAttribs.at(i));
        }

        if (typeObserver == TObsMap)
        {
            // ao definir os valores dos atributos do agente,
            // redefino o tipo do atributos na super classe ObserverMap
            obsMap->setAttributes(obsAttribs, obsParams, obsParamsAtribs);
            obsMap->setSubjectAttributes(obsAttribs, TObsTrajectory);
        }
        else
        {
            obsImage->setAttributes(obsAttribs, obsParams, obsParamsAtribs);
            obsImage->setSubjectAttributes(obsAttribs, TObsTrajectory);
        }
        lua_pushnumber(luaL, obsId);
        return 1;
    }

    return 0;
}
Exemple #4
0
/// Creates several types of observers
/// parameters: observer type, observeb attributes table, observer type parameters
// verif. ref (endereco na pilha lua)
// olhar a classe event
int luaCell::createObserver( lua_State * )
{
    // recupero a referencia da celula
    lua_rawgeti(luaL, LUA_REGISTRYINDEX, ref);

    // flags para a definição do uso de compressão
    // na transmissão de datagramas e da visibilidade
    // dos observadores Udp Sender
    bool compressDatagram = false, obsVisible = true;

    // recupero a tabela de
    // atributos da celula
    int top = lua_gettop(luaL);

    // Nao modifica em nada a pilha
    // recupera o enum referente ao tipo
    // do observer
    int typeObserver = (int)luaL_checkinteger(luaL, -4);

    //@RAIAN
    // Para o Observer do tipo Neighbohrood
    if( typeObserver != TObsNeigh )
    {
        bool isGraphicType = (typeObserver == TObsDynamicGraphic) || (typeObserver == TObsGraphic);

        //------------------------
        QStringList allAttribs, obsAttribs;

        // Pecorre a pilha lua recuperando todos os atributos celula
        lua_pushnil(luaL);
        while(lua_next(luaL, top) != 0)
        {
            QString key( luaL_checkstring(luaL, -2) );

            allAttribs.push_back(key);
            lua_pop(luaL, 1);
        }

        //------------------------
        // pecorre a pilha lua recuperando
        // os atributos celula que se quer observar
        lua_settop(luaL, top - 1);
        top = lua_gettop(luaL);

        // Verificacao da sintaxe da tabela Atributos
        if(! lua_istable(luaL, top) )
        {
            qFatal("Error: Attributes table not found. Incorrect sintax.\n");
            return -1;
        }

        bool attribTable = false;

        lua_pushnil(luaL);
        while(lua_next(luaL, top - 1 ) != 0)
        {
            QString key( luaL_checkstring(luaL, -1) );
            attribTable = true;

            // Verifica se o atributo informado não existe deve ter sido digitado errado
            if (allAttribs.contains(key))
            {
                obsAttribs.push_back(key);
                if (! observedAttribs.contains(key))
                    observedAttribs.push_back(key);
            }
            else
            {
                if ( ! key.isNull() || ! key.isEmpty())
                {
                    qFatal("Error: Attribute name '%s' not found.\n", qPrintable(key));
                    return -1;
                }
            }
            lua_pop(luaL, 1);
        }
        //------------------------

        // if ((obsAttribs.empty() ) && (! isGraphicType))
        if (obsAttribs.empty())
        {
            obsAttribs = allAttribs;
            observedAttribs = allAttribs;
        }

        //if(! lua_istable(luaL, top) )
        //{
        //    qWarning("Warning: Parameter table not found. Incorrect sintax.");
        //    return 0;
        //}

        QStringList cols, obsParams;

        // Recupera a tabela de parametros os observadores do tipo Table e Graphic
        // caso não seja um tabela a sintaxe do metodo esta incorreta
        lua_pushnil(luaL);
        while(lua_next(luaL, top) != 0)
        {
            QString key;
            if (lua_type(luaL, -2) == LUA_TSTRING)
                key = QString(luaL_checkstring(luaL, -2));

            switch (lua_type(luaL, -1))
            {
            case LUA_TSTRING:
            {
                QString value( luaL_checkstring(luaL, -1));
                cols.push_back(value);
                break;
            }

            case LUA_TBOOLEAN:
            {
                bool val = lua_toboolean(luaL, -1);
                if (key == "visible")
                    obsVisible = val;
                else // if (key == "compress")
                    compressDatagram = val;
                break;
            }

            case LUA_TTABLE:
            {
                int tableTop = lua_gettop(luaL);

                lua_pushnil(luaL);
                while(lua_next(luaL, tableTop) != 0)
                {
                    if (lua_type(luaL, -2) == LUA_TSTRING)
                        obsParams.append(luaL_checkstring(luaL, -2));

                    switch (lua_type(luaL, -1))
                    {
                    case LUA_TNUMBER:
                        cols.append(QString::number(luaL_checknumber(luaL, -1)) );
                        break;

                    case LUA_TSTRING:
                        cols.append(luaL_checkstring(luaL, -1));
                        break;
                    }
                    lua_pop(luaL, 1);
                }
            }

            default:
                break;
            }
            lua_pop(luaL, 1);
        }

        // Caso não seja definido nenhum parametro,
        // e o observador não é TextScreen então
        // lança um warning
        if ((cols.isEmpty()) && (typeObserver != TObsTextScreen))
        {
            if (! QUIET_MODE )
                qWarning("Warning: The Parameters Table is empty.");
        }
        //------------------------

        ObserverTextScreen *obsText = 0;
        ObserverTable *obsTable = 0;
        ObserverGraphic *obsGraphic = 0;
        ObserverLogFile *obsLog = 0;
        ObserverUDPSender *obsUDPSender = 0;

        int obsId = -1;

        switch (typeObserver)
        {
        case TObsTextScreen:
            obsText = (ObserverTextScreen*)
                      CellSubjectInterf::createObserver(TObsTextScreen);
            if (obsText)
            {
                obsId = obsText->getId();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsLogFile:
            obsLog = (ObserverLogFile*)
                     CellSubjectInterf::createObserver(TObsLogFile);
            if (obsLog)
            {
                obsId = obsLog->getId();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsTable:
            obsTable = (ObserverTable *)
                       CellSubjectInterf::createObserver(TObsTable);
            if (obsTable)
            {
                obsId = obsTable->getId();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsDynamicGraphic:
            obsGraphic = (ObserverGraphic *)
                         CellSubjectInterf::createObserver(TObsDynamicGraphic);
            if (obsGraphic)
            {
                obsGraphic->setObserverType(TObsDynamicGraphic);
                obsId = obsGraphic->getId();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsGraphic:
            obsGraphic = (ObserverGraphic *)
                         CellSubjectInterf::createObserver(TObsGraphic);
            if (obsGraphic)
            {
                obsId = obsGraphic->getId();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsUDPSender:
            obsUDPSender = (ObserverUDPSender *)
                           CellSubjectInterf::createObserver(TObsUDPSender);
            if (obsUDPSender)
            {
                obsId = obsUDPSender->getId();
                obsUDPSender->setCompressDatagram(compressDatagram);

                if (obsVisible)
                    obsUDPSender->show();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsMap:
        default:
            if (! QUIET_MODE )
            {
                qWarning("Warning: In this context, the code '%s' does not correspond to a "
                         "valid type of Observer.",  getObserverName(typeObserver) );
            }
            return 0;
        }

#ifdef DEBUG_OBSERVER
        qDebug() << "luaCell";
        qDebug() << "obsParams: " << obsParams;
        qDebug() << "obsAttribs: " << obsAttribs;
        qDebug() << "allAttribs: " << allAttribs;
        qDebug() << "cols: " << cols;
#endif

        //@RODRIGO
        //serverSession->add(obsKey);

        /// Define alguns parametros do observador instanciado ---------------------------------------------------

        if (obsLog)
        {
            obsLog->setAttributes(obsAttribs);

            if (cols.at(0).isNull() || cols.at(0).isEmpty())
            {
                if (! QUIET_MODE )
                    qWarning("Warning: Filename was not specified, using a "
                             "default \"%s\".", qPrintable(DEFAULT_NAME));
                obsLog->setFileName(DEFAULT_NAME + ".csv");
            }
            else
            {
                obsLog->setFileName(cols.at(0));
            }

            // caso não seja definido, utiliza o default ";"
            if ((cols.size() < 2) || cols.at(1).isNull() || cols.at(1).isEmpty())
            {
                if (! QUIET_MODE )
                    qWarning("Warning: Separator not defined, using \";\".");
                obsLog->setSeparator();
            }
            else
            {
                obsLog->setSeparator(cols.at(1));
            }

            lua_pushnumber(luaL, obsId);
            return 1;
        }

        if (obsText)
        {
            obsText->setAttributes(obsAttribs);
            lua_pushnumber(luaL, obsId);
            return 1;
        }

        if (obsTable)
        {
            if ((cols.size() < 2) || cols.at(0).isNull() || cols.at(0).isEmpty()
                    || cols.at(1).isNull() || cols.at(1).isEmpty())
            {
                if (! QUIET_MODE )
                    qWarning("Warning: Column title not defined.");
            }

            obsTable->setColumnHeaders(cols);
            obsTable->setAttributes(obsAttribs);

            lua_pushnumber(luaL, obsId);
            return 1;
        }

        if (obsGraphic)
        {
            obsGraphic->setLegendPosition();

            // Takes titles of three first locations
            obsGraphic->setTitles(cols.at(0), cols.at(1), cols.at(2));
            cols.removeFirst(); // remove graphic title
            cols.removeFirst(); // remove axis x title
            cols.removeFirst(); // remove axis y title

            // Splits the attribute labels in the cols list
            obsGraphic->setAttributes(obsAttribs, cols.takeFirst().split(";", QString::SkipEmptyParts),
                                      obsParams, cols);

            lua_pushnumber(luaL, obsId);
            return 1;
        }

        if(obsUDPSender)
        {
            obsUDPSender->setAttributes(obsAttribs);

            // if (cols.at(0).isEmpty())
            if (cols.isEmpty())
            {
                if (! QUIET_MODE )
                    qWarning("Warning: Port not defined.");
            }
            else
            {
                obsUDPSender->setPort(cols.at(0).toInt());
            }

            // broadcast
            if ((cols.size() == 1) || ((cols.size() == 2) && cols.at(1).isEmpty()) )
            {
                if (! QUIET_MODE )
                    qWarning("Warning: Observer will send to broadcast.");
                obsUDPSender->addHost(BROADCAST_HOST);
            }
            else
            {
                // multicast or unicast
                for(int i = 1; i < cols.size(); i++) {
                    if (! cols.at(i).isEmpty())
                        obsUDPSender->addHost(cols.at(i));
                }
            }
            lua_pushnumber(luaL, obsId);
            return 1;
        }
    }
    //@RAIAN
    // Comeca a criacao do Observer do tipo Neighborhood
    else
    {
        QStringList obsParams, obsParamsAtribs;

        bool getObserverID = false, isLegend = false;
        int obsID = -1;

        AgentObserverMap *obsMap = 0;
        luaCellularSpace *cellSpace = 0;

        // Recupera os parametros
        lua_pushnil(luaL);
        while(lua_next(luaL, top - 1) != 0)
        {
            // Recupera o ID do observer map
            if( lua_isnumber(luaL, -1) && (!getObserverID) )
            {
                obsID = luaL_checknumber(luaL, -1);
                getObserverID = true;
                isLegend = true;
            }

            //Recupera o espaco celular e a legenda
            if(lua_istable(luaL, -1))
            {
                int paramTop = lua_gettop(luaL);

                lua_pushnil(luaL);
                while(lua_next(luaL, paramTop) != 0)
                {
                    if(isudatatype(luaL, -1, "TeCellularSpace"))
                    {
                        cellSpace = Luna<luaCellularSpace>::check(luaL, -1);
                    }
                    else
                    {
                        if(isLegend)
                        {
                            QString key(luaL_checkstring(luaL, -2));
                            obsParams.push_back(key);

                            bool boolAux;
                            double numAux;
                            QString strAux;

                            switch(lua_type(luaL, -1))
                            {
                            case LUA_TBOOLEAN:
                                boolAux = lua_toboolean(luaL, -1);
                                break;

                            case LUA_TNUMBER:
                                numAux = luaL_checknumber(luaL, -1);
                                obsParamsAtribs.push_back(QString::number(numAux));
                                break;

                            case LUA_TSTRING:
                                strAux = luaL_checkstring(luaL, -1);
                                obsParamsAtribs.push_back(QString(strAux));

                            case LUA_TNIL:
                            case LUA_TTABLE:
                            default:
                                ;
                            }
                        }
                    }
                    lua_pop(luaL, 1);
                }
            }
            lua_pop(luaL, 1);
        }

        QString errorMsg = QString("\nError: The Observer ID \"%1\" was not found. "
                                   "Check the declaration of this observer.\n").arg(obsID);

        if(!cellSpace)
            qFatal("%s", qPrintable(errorMsg));

        QStringList neighIDs;
        QString exhibitionName;

        // Recupera os IDs das Vizinhancas a serem observadas
        lua_pushnil(luaL);
        while(lua_next(luaL, top - 2) != 0)
        {
            const char* key = luaL_checkstring(luaL, -1);
            this->attrNeighName.append(key);
            exhibitionName = QString("neighborhood (%1)").arg(this->attrNeighName);

            neighIDs.push_back(exhibitionName);
            observedAttribs.push_back(exhibitionName);

#ifdef TME_BLACK_BOARD
            // Solucao provisoria para o observer do tipo Neighbohrood
            observedAttribs.push_front("@getNeighborhoodState");
#endif
            lua_pop(luaL, 1);
        }

        if(typeObserver == TObsNeigh)
        {
            obsMap = (AgentObserverMap *)cellSpace->getObserver(obsID);
            if(!obsMap)
                qFatal("%s", qPrintable(errorMsg));

            obsMap->registry(this, exhibitionName);
            obsMap->setAttributes(neighIDs, obsParams, obsParamsAtribs);
            obsMap->setSubjectAttributes(neighIDs, TObsNeighborhood, this->attrNeighName);
        }

        // @RAIAN: Acrescentei estas linhas para retornar o ID do observer, que estava faltando
        lua_pushnumber(luaL, obsID);
        return 1;
    }
    //@RAIAN - FIM
    return 0;
}
Exemple #5
0
int luaLocalAgent::createObserver(lua_State *L)
{
    // recupero a referencia da celula
    Reference<luaAgent>::getReference(luaL);

    // flags para a defini(C)(C)o do uso de compress(C)o
    // na transmiss(C)o de datagramas e da visibilidade
    // dos observadores Udp Sender
    bool compressDatagram = false, obsVisible = true;

    // recupero a tabela de atributos da celula
    int top = lua_gettop(luaL);

    // No modifica em nada a pilha recupera o enum
    // referente ao tipo do observer
    int typeObserver =(int)luaL_checkinteger(luaL, 1); //top - 3);

    if ((typeObserver !=  TObsMap) && (typeObserver !=  TObsImage))
    {
        bool isGraphicType =(typeObserver == TObsDynamicGraphic)
            ||(typeObserver == TObsGraphic);

        //------------------------
        QStringList allAttribs, obsAttribs;
        QList<QPair<QString, QString> > allStates;

        // Pecorre a pilha lua recuperando
        // todos os atributos celula
        lua_pushnil(luaL);
        while (lua_next(luaL, top) != 0)
        {
            QString key;

            switch (lua_type(luaL, -2))
            {
            case LUA_TSTRING:
                key = QString(luaL_checkstring(luaL, -2));
                break;

            case LUA_TNUMBER:
                {
                    char aux[100];
                    double number = luaL_checknumber(luaL, -2);
                    sprintf(aux, "%g", number);
                    key = QString(aux);
                    break;
                }
            default:
                break;
            }

            // Recupero os estados do TeState
            if (isudatatype(luaL, -1, "TeState"))
            {
                ControlMode*  lcm =(ControlMode*)Luna<luaControlMode>::check(L, -1);

                QString state, transition;
                state.append(lcm->getControlModeName().c_str());

                // Adiciona o estado do atributo na lista de parametros
                // allAttribs.push_back(state);

                // Recupero a transi(C)(C)o dos estados
                ProcessCompositeInterf::iterator prIt;
                prIt = lcm->ProcessCompositeInterf::begin();

                JumpCompositeInterf::iterator jIt;
                jIt = prIt->JumpCompositeInterf::begin();

                while (jIt != prIt->JumpCompositeInterf::end())
                {
                    transition = QString((*jIt)->getTargetControlModeName().c_str());
                    jIt++;
                }

                // cria um par(estado, transi(C)(C)o) e adiciona na lista de estados
                allStates.push_back(qMakePair(state, transition));
            }
            allAttribs.push_back(key);
            lua_pop(luaL, 1);
        }

        // Adiciono o currentState no observador
        allAttribs.push_back("currentState"); // insere o estado atual

        //------------------------
        // pecorre a pilha lua recuperando
        // os atributos celula que se quer observar
        lua_settop(luaL, top - 1);
        top = lua_gettop(luaL);

        // Verificao da sintaxe da tabela Atributos
        if (!lua_istable(luaL, top))
        {
            qFatal("Error: Attributes table not found. Incorrect sintax.\n");
            return -1;
        }

        lua_pushnil(luaL);
        while (lua_next(luaL, top - 1) != 0)
        {
            QString key = luaL_checkstring(luaL, -1);

            // Verifica se o atributo informado existe
            // ou pode ter sido digitado errado
            if (allAttribs.contains(key))
            {
                obsAttribs.push_back(key);
                if (!observedAttribs.contains(key))
                    observedAttribs.push_back(key);
            }
            else
            {
                if (!key.isNull() || !key.isEmpty())
                {
					string err_out = string("Error: Attribute name '") + string(qPrintable(key)) + string("' not found.");
					lua_getglobal(L, "customError");
					lua_pushstring(L, err_out.c_str());
					lua_pushnumber(L, 4);
					lua_call(L, 2, 0);
                    return -1;
                }
            }
            lua_pop(luaL, 1);
        }
        //------------------------

        // Adiciono o currentState no observador
        if ((obsAttribs.empty()) && (!isGraphicType))
        {
            obsAttribs = allAttribs;
            observedAttribs = allAttribs;
        }

        //------------------------
        if (!lua_istable(luaL, top))
        {
            qFatal("Error: Parameter table not found. Incorrect sintax.\n");
            return -1;
        }

        QStringList obsParams, obsParamsAtribs; // parametros/atributos da legenda
        QStringList cols;
        bool isLegend = false;

        // Recupera a tabela de parametros
        lua_pushnil(luaL);
        while (lua_next(luaL, top) != 0)
        {
            QString key;
            if (lua_type(luaL, -2) == LUA_TSTRING)
                key = QString(luaL_checkstring(luaL, -2));

            switch (lua_type(luaL, -1))
            {
            case LUA_TSTRING:
            {
                QString value(luaL_checkstring(luaL, -1));
                cols.push_back(value);
                break;
            }
            case LUA_TBOOLEAN:
            {
                bool val = lua_toboolean(luaL, -1);
                if (key == "visible")
                    obsVisible = val;
                else // if (key == "compress")
                    compressDatagram = val;
                break;
            }

            // Recupera a celula que se deseja observar o automato
            case LUA_TTABLE:
                {
                    int paramTop = lua_gettop(luaL);
                    QString value;

                    lua_pushnil(luaL);
                    while (lua_next(luaL, paramTop) != 0)
                    {
                        if (lua_type(luaL, -2) == LUA_TSTRING)
                        {
                            value = QString(luaL_checkstring(luaL, -2));

                            if (value == "cObj_")
                            {
                                //int cellTop = lua_gettop(luaL);
                                //lua_pushstring(luaL, "cObj_");
                                //lua_gettable(luaL, cellTop);

                                whereCell =(luaCell*)Luna<luaCell>::check(L, -1);
                                // lua_pop(luaL, 1); // lua_pushstring
                            }

                            if (isLegend)
                            {
                                // bool boolAux;
                                const char *strAux;
                                double numAux = -1;

                                obsParams.push_back(value);

                                switch (lua_type(luaL, -1))
                                {
                                case LUA_TBOOLEAN:
                                    // boolAux = lua_toboolean(luaL, -1);
                                    // obsParamsAtribs.push_back(QString::number(boolAux));
                                    break;

                                case LUA_TNUMBER:
                                    numAux = luaL_checknumber(luaL, -1);
                                    obsParamsAtribs.push_back(QString::number(numAux));
                                    break;

                                case LUA_TSTRING:
                                    strAux = luaL_checkstring(luaL, -1);
                                    obsParamsAtribs.push_back(QString(strAux));
                                    break;

                                case LUA_TNIL:
                                case LUA_TTABLE:
                                default:
                                    break;
                                }
                            }
                        }
                        lua_pop(luaL, 1);
                    }
                    isLegend = true;
                }
            default:
                break;
            }
            lua_pop(luaL, 1);
        }

        ObserverTextScreen *obsText = 0;
        ObserverTable *obsTable = 0;
        ObserverGraphic *obsGraphic = 0;
        ObserverLogFile *obsLog = 0;
        ObserverUDPSender *obsUDPSender = 0;
        ObserverStateMachine *obsStateMachine = 0;

        int obsId = -1;
        // QStringList attrs;

        switch (typeObserver)
        {
        case TObsTextScreen:
            obsText =(ObserverTextScreen *)
                LocalAgentSubjectInterf::createObserver(TObsTextScreen);
            if (obsText)
            {
                obsId = obsText->getId();
            }
            else
            {
                if (execModes != Quiet)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsLogFile:
            obsLog =(ObserverLogFile *)
                LocalAgentSubjectInterf::createObserver(TObsLogFile);
            if (obsLog)
            {
                obsId = obsLog->getId();
            }
            else
            {
                if (execModes != Quiet)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsTable:
            obsTable =(ObserverTable *)
                LocalAgentSubjectInterf::createObserver(TObsTable);
            if (obsTable)
            {
                obsId = obsTable->getId();
            }
            else
            {
                if (execModes != Quiet)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsUDPSender:
            obsUDPSender =(ObserverUDPSender *)
                LocalAgentSubjectInterf::createObserver(TObsUDPSender);
            if (obsUDPSender)
            {
                obsId = obsUDPSender->getId();
                obsUDPSender->setCompressDatagram(compressDatagram);

                if (obsVisible)
                    obsUDPSender->show();
            }
            else
            {
                if (execModes != Quiet)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsStateMachine:
            obsStateMachine =(ObserverStateMachine *)
                LocalAgentSubjectInterf::createObserver(TObsStateMachine);
            if (obsStateMachine)
            {
                obsId = obsStateMachine->getId();
            }
            else
            {
                if (execModes != Quiet)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsDynamicGraphic:
            obsGraphic =(ObserverGraphic *)
                LocalAgentSubjectInterf::createObserver(TObsDynamicGraphic);
            if (obsGraphic)
            {
                obsGraphic->setObserverType(TObsDynamicGraphic);
                obsId = obsGraphic->getId();
            }
            else
            {
                if (execModes != Quiet)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsGraphic:
            obsGraphic =(ObserverGraphic *)
                LocalAgentSubjectInterf::createObserver(TObsGraphic);
            if (obsGraphic)
            {
                obsId = obsGraphic->getId();
            }
            else
            {
                if (execModes != Quiet)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        default:
            if (execModes != Quiet)
            {
                qWarning("Warning: In this context, the code '%s' does not correspond to a "
                "valid type of Observer.",  getObserverName(typeObserver));
            }
            return 0;
        }

        /// Define alguns parametros do observador instanciado -------------------------------------
        if (obsLog)
        {
            obsLog->setAttributes(obsAttribs);

            if (cols.at(0).isNull() || cols.at(0).isEmpty())
            {
                obsLog->setFileName(DEFAULT_NAME + ".csv");
            }
            else
            {
                obsLog->setFileName(cols.at(0));
            }

            // caso no seja definido, utiliza o default ";"
            if ((cols.size() < 2) || cols.at(1).isNull() || cols.at(1).isEmpty())
            {
                obsLog->setSeparator();
            }
            else
            {
                obsLog->setSeparator(cols.at(1));
            }

            lua_pushnumber(luaL, obsId);
            return 1;
        }

        if (obsText)
        {
            obsText->setAttributes(obsAttribs);

            lua_pushnumber(luaL, obsId);
            return 1;
        }

        if (obsTable)
        {
            obsTable->setColumnHeaders(cols);
            obsTable->setAttributes(obsAttribs);

            lua_pushnumber(luaL, obsId);
            return 1;
        }

        if (obsUDPSender)
        {
            obsUDPSender->setAttributes(obsAttribs);
            obsUDPSender->setPort(cols.at(0).toInt());

            // broadcast
            if ((cols.size() == 1) ||((cols.size() == 2) && cols.at(1).isEmpty()))
            {
                obsUDPSender->addHost(BROADCAST_HOST);
            }
            else
            {
                // multicast or unicast
                for (int i = 1; i < cols.size(); i++){
                    if (!cols.at(i).isEmpty())
                        obsUDPSender->addHost(cols.at(i));
                }
            }
            lua_pushnumber(luaL, obsId);
            return 1;
        }

        if (obsGraphic)
        {
            obsGraphic->setLegendPosition();

            // if (obsAttribs.contains("currentState"))
            //    obsGraphic->setCurveStyle();

            // Takes titles of three first locations
            obsGraphic->setTitles(cols.at(0), cols.at(1), cols.at(2));
            cols.removeFirst(); // remove graphic title
            cols.removeFirst(); // remove axis x title
            cols.removeFirst(); // remove axis y title

            // Splits the attribute labels in the cols list
            obsGraphic->setAttributes(obsAttribs, cols.takeFirst().split(";", QString::SkipEmptyParts),
                obsParams, obsParamsAtribs);

            lua_pushnumber(luaL, obsId);
            return 1;
        }

        ///////////////////////////////////////////

        if (obsStateMachine)
        {
            obsStateMachine->addState(allStates);
            obsStateMachine->setAttributes(obsAttribs, obsParams, obsParamsAtribs);

            lua_pushnumber(luaL, obsId);
            return 1;
        }
    } // typeObserver !=  TerraMEObserver::TObsMap)
    else
    {
        QStringList obsParams, obsParamsAtribs; // parametros/atributos da legenda

        bool getObserverID = false, isLegend = false;
        int obsID = -1;

        AgentObserverMap *obsMap = 0;

        // Recupera os parametros
        lua_pushnil(luaL);
        while (lua_next(luaL, top - 1) != 0)
        {
            // Recupera o ID do observer map
            if ((lua_isnumber(luaL, -1) && (!getObserverID)))
            {
                // obsID = lua_tonumber(luaL, paramTop - 1);
                obsID = luaL_checknumber(luaL, -1);
                getObserverID = true;
                isLegend = true;
            }

            // recupera o espao celular
            if (lua_istable(luaL, -1))
            {
                int paramTop = lua_gettop(luaL);

                lua_pushnil(luaL);
                while (lua_next(luaL, paramTop) != 0)
                {
                    if (isudatatype(luaL, -1, "TeCellularSpace"))
                    {
                        cellSpace = Luna<luaCellularSpace>::check(L, -1);
                    }
                    else
                    {
                        if (isLegend)
                        {
                            QString key = luaL_checkstring(luaL, -2);
                            obsParams.push_back(key);

                            bool boolAux;
                            double numAux;
                            QString strAux;

                            switch (lua_type(luaL, -1))
                            {
                            case LUA_TBOOLEAN:
                                boolAux = lua_toboolean(luaL, -1);
                                break;

                            case LUA_TNUMBER:
                                numAux = luaL_checknumber(luaL, -1);
                                obsParamsAtribs.push_back(QString::number(numAux));
                                break;

                            case LUA_TSTRING:
                                strAux = luaL_checkstring(luaL, -1);
                                obsParamsAtribs.push_back(QString(strAux));
                                break;

                            default:
                                break;
                            }
                        } // isLegend
                    }

                    lua_pop(luaL, 1);
                }
            }
            lua_pop(luaL, 1);
        }

        QString errorMsg = QString("\nError: The Observer ID \"%1\" was not found. "
            "Check the declaration of this observer.\n").arg(obsID);

        if (!cellSpace)
            qFatal("%s", qPrintable(errorMsg));

        QStringList allAttribs, obsAttribs;

        // Recupera todos os atributos do agente
        // buscando apenas o classe do agente
        lua_pushnil(luaL);
        while (lua_next(luaL, top) != 0)
        {
            if (lua_type(luaL, -2) == LUA_TSTRING)
            {
                QString key;
                key = QString(luaL_checkstring(luaL, -2));

                if (key == "class")
                    attrClassName = QString(luaL_checkstring(luaL, -1));
            }
            lua_pop(luaL, 1);
        }

        attrClassName.push_front("(");
        attrClassName.push_back(")");

        if (typeObserver == TObsMap)
        {
            obsMap =(AgentObserverMap *)cellSpace->getObserver(obsID);

            if (!obsMap)
                qFatal("%s", qPrintable(errorMsg));

            obsMap->registry(this, attrClassName);
        }

        // Recupera os atributos
        lua_pushnil(luaL);
        while (lua_next(luaL, top - 2) != 0)
        {
            QString key = QString(luaL_checkstring(luaL, -1));

            if (key == "currentState")
                obsAttribs.push_back(key + attrClassName);
            else
                obsAttribs.push_back(key);

            lua_pop(luaL, 1);
        }

        for (int i = 0; i < obsAttribs.size(); i++)
        {
            if (!observedAttribs.contains(obsAttribs.at(i)))
                observedAttribs.push_back(obsAttribs.at(i));
        }

        if (typeObserver == TObsMap)
        {
            // ao definir os valores dos atributos do agente,
            // redefino o tipo do atributos na super classe ObserverMap
            obsMap->setAttributes(obsAttribs, obsParams, obsParamsAtribs);
            obsMap->setSubjectAttributes(obsAttribs, TObsAutomaton, attrClassName);
        }
        lua_pushnumber(luaL, obsID);
        return 1;
    }
    return 0;
}
Exemple #6
0
/// Creates several types of observers
/// parameters: observer type, observeb attributes table, observer type parameters
// verif. ref(endereco na pilha lua)
// olhar a classe event
int luaSociety::createObserver(lua_State *)
{
    // recupero a referencia da celula
    Reference<luaSociety>::getReference(luaL);

    // flags para a definicao do uso de compressao
    // na transmissao de datagramas e da visibilidade
    // dos observadores Udp Sender
    bool compressDatagram = false, obsVisible = true;

    // recupero a tabela de
    // atributos da celula
    int top = lua_gettop(luaL);

    // Nao modifica em nada a pilha
    // recupera o enum referente ao tipo
    // do observer
    int typeObserver =(int)luaL_checkinteger(luaL, -4);

    //@RAIAN
    // Para o Observer do tipo Neighbohrood
    bool isGraphicType =(typeObserver == TObsDynamicGraphic) ||(typeObserver == TObsGraphic);

    //------------------------
    QStringList allAttribs, obsAttribs;

    // Pecorre a pilha lua recuperando todos os atributos celula
    lua_pushnil(luaL);
    while (lua_next(luaL, top) != 0)
    {
        QString key(luaL_checkstring(luaL, -2));

        allAttribs.push_back(key);
        lua_pop(luaL, 1);
    }

    //------------------------
    // pecorre a pilha lua recuperando
    // os atributos celula que se quer observar
    lua_settop(luaL, top - 1);
    top = lua_gettop(luaL);

    // Verificacao da sintaxe da tabela Atributos
    if (!lua_istable(luaL, top))
    {
        qFatal("Error: Attributes table not found. Incorrect sintax.\n");
        return -1;
    }

    bool attribTable = false;

    lua_pushnil(luaL);
    while (lua_next(luaL, top - 1) != 0)
    {
        QString key(luaL_checkstring(luaL, -1));
        attribTable = true;

        // Verifica se o atributo informado nao existe deve ter sido digitado errado
        if (allAttribs.contains(key))
        {
            obsAttribs.push_back(key);
            if (!observedAttribs.contains(key))
                observedAttribs.push_back(key);
        }
        else
        {
            if (!key.isNull() || !key.isEmpty())
            {
                string err_out = string("Error: Attribute name '") + string(qPrintable(key)) + string("' not found.");
                lua_getglobal(L, "customError");
                lua_pushstring(L, err_out.c_str());
                lua_pushnumber(L, 4);
                lua_call(L, 2, 0);
                return -1;
            }
        }
        lua_pop(luaL, 1);
    }
    //------------------------

    // if ((obsAttribs.empty()) && (! isGraphicType))
    if (obsAttribs.empty())
    {
        obsAttribs = allAttribs;
        observedAttribs = allAttribs;
    }

    QStringList cols, obsParams;

    // Recupera a tabela de parametros os observadores do tipo Table e Graphic
    // caso nao seja um tabela a sintaxe do metodo esta incorreta
    lua_pushnil(luaL);
    while (lua_next(luaL, top) != 0)
    {
        QString key;
        if (lua_type(luaL, -2) == LUA_TSTRING)
            key = QString(luaL_checkstring(luaL, -2));

        switch (lua_type(luaL, -1))
        {
        case LUA_TSTRING:
        {
            QString value(luaL_checkstring(luaL, -1));
            cols.push_back(value);
            break;
        }

        case LUA_TBOOLEAN:
        {
            bool val = lua_toboolean(luaL, -1);
            if (key == "visible")
                obsVisible = val;
            else // if (key == "compress")
                compressDatagram = val;
            break;
        }

        case LUA_TTABLE:
        {
            int tableTop = lua_gettop(luaL);

            lua_pushnil(luaL);
            while (lua_next(luaL, tableTop) != 0)
            {
                if (lua_type(luaL, -2) == LUA_TSTRING)
                    obsParams.append(luaL_checkstring(luaL, -2));

                switch (lua_type(luaL, -1))
                {
                case LUA_TNUMBER:
                    cols.append(QString::number(luaL_checknumber(luaL, -1)));
                    break;

                case LUA_TSTRING:
                    cols.append(luaL_checkstring(luaL, -1));
                    break;
                }
                lua_pop(luaL, 1);
            }
        }

        default:
            break;
        }
        lua_pop(luaL, 1);
    }


    // Caso nao seja definido nenhum parametro,
    // e o observador nao e' TextScreen entao
    // lanca um warning
    if ((cols.isEmpty()) && (typeObserver != TObsTextScreen))
    {
        if (execModes != Quiet) {
            string err_out = string("Warning: The parameter table is empty.");
            lua_getglobal(L, "customWarning");
            lua_pushstring(L, err_out.c_str());
            lua_pushnumber(L, 5);
            lua_call(L, 2, 0);
        }
    }
    //------------------------

    ObserverTextScreen *obsText = 0;
    ObserverTable *obsTable = 0;
    ObserverGraphic *obsGraphic = 0;
    ObserverLogFile *obsLog = 0;
    ObserverUDPSender *obsUDPSender = 0;

    int obsId = -1;

    switch (typeObserver)
    {
    case TObsTextScreen:
        obsText =(ObserverTextScreen*)
                 SocietySubjectInterf::createObserver(TObsTextScreen);
        if (obsText)
        {
            obsId = obsText->getId();
        }
        else
        {
            if (execModes != Quiet)
                qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
        }
        break;

    case TObsLogFile:
        obsLog =(ObserverLogFile*)
                SocietySubjectInterf::createObserver(TObsLogFile);
        if (obsLog)
        {
            obsId = obsLog->getId();
        }
        else
        {
            if (execModes != Quiet)
                qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
        }
        break;

    case TObsTable:
        obsTable =(ObserverTable *)
                  SocietySubjectInterf::createObserver(TObsTable);
        if (obsTable)
        {
            obsId = obsTable->getId();
        }
        else
        {
            if (execModes != Quiet)
                qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
        }
        break;

    case TObsDynamicGraphic:
        obsGraphic =(ObserverGraphic *)
                    SocietySubjectInterf::createObserver(TObsDynamicGraphic);
        if (obsGraphic)
        {
            obsGraphic->setObserverType(TObsDynamicGraphic);
            obsId = obsGraphic->getId();
        }
        else
        {
            if (execModes != Quiet)
                qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
        }
        break;

    case TObsGraphic:
        obsGraphic =(ObserverGraphic *)
                    SocietySubjectInterf::createObserver(TObsGraphic);
        if (obsGraphic)
        {
            obsId = obsGraphic->getId();
        }
        else
        {
            if (execModes != Quiet)
                qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
        }
        break;

    case TObsUDPSender:
        obsUDPSender =(ObserverUDPSender *)
                      SocietySubjectInterf::createObserver(TObsUDPSender);
        if (obsUDPSender)
        {
            obsId = obsUDPSender->getId();
            obsUDPSender->setCompressDatagram(compressDatagram);

            if (obsVisible)
                obsUDPSender->show();
        }
        else
        {
            if (execModes != Quiet)
                qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
        }
        break;

    case TObsMap:
    default:
        if (execModes != Quiet)
        {
            qWarning("Warning: In this context, the code '%s' does not correspond to a "
                     "valid type of Observer.",  getObserverName(typeObserver));
        }
        return 0;
    }

    /// Define alguns parametros do observador instanciado ---------------------------------------------------

    if (obsLog)
    {
        obsLog->setAttributes(obsAttribs);
        obsLog->setFileName(cols.at(0));
        obsLog->setSeparator(cols.at(1));
        obsLog->setWriteMode(cols.at(2));

        lua_pushnumber(luaL, obsId);
        lua_pushlightuserdata(luaL, (void*) obsLog);

        return 2;
    }

    if (obsText)
    {
        obsText->setAttributes(obsAttribs);
        lua_pushnumber(luaL, obsId);
        lua_pushlightuserdata(luaL, (void*) obsText);

        return 2;
    }

    if (obsTable)
    {
        obsTable->setColumnHeaders(cols);
        obsTable->setAttributes(obsAttribs);

        lua_pushnumber(luaL, obsId);
        lua_pushlightuserdata(luaL, (void*) obsTable);

        return 2;
    }

    if (obsGraphic)
    {
        obsGraphic->setLegendPosition();

        // Takes titles of three first locations
        obsGraphic->setTitles(cols.at(0), cols.at(1), cols.at(2));
        cols.removeFirst(); // remove graphic title
        cols.removeFirst(); // remove axis x title
        cols.removeFirst(); // remove axis y title

        // Splits the attribute labels in the cols list
        obsGraphic->setAttributes(obsAttribs, cols.takeFirst().split(";", QString::SkipEmptyParts),
                                  obsParams, cols);

        lua_pushnumber(luaL, obsId);
        lua_pushlightuserdata(luaL, (void*) obsGraphic);

        return 2;
    }

    if (obsUDPSender)
    {
        obsUDPSender->setAttributes(obsAttribs);
        obsUDPSender->setPort(cols.at(0).toInt());

        // broadcast
        if ((cols.size() == 1) ||((cols.size() == 2) && cols.at(1).isEmpty()))
        {
            obsUDPSender->addHost(BROADCAST_HOST);
        }
        else
        {
            // multicast or unicast
            for (int i = 1; i < cols.size(); i++) {
                if (!cols.at(i).isEmpty())
                    obsUDPSender->addHost(cols.at(i));
            }
        }
        lua_pushnumber(luaL, obsId);
        lua_pushlightuserdata(luaL, (void*) obsUDPSender);

        return 2;
    }

    return 0;
}
Exemple #7
0
/// Creates several types of observers
/// parameters: observer type, observeb attributes table, observer type parameters
// verif. ref (endereco na pilha lua)
// olhar a classe event
int luaCell::createObserver( lua_State *L )
{	
    // recupero a referencia da celula
    lua_rawgeti(luaL, LUA_REGISTRYINDEX, ref);
            
    // flags para a definição do uso de compressão
    // na transmissão de datagramas e da visibilidade
    // dos observadores Udp Sender 
    bool compressDatagram = false, obsVisible = true;

    // recupero a tabela de
    // atributos da celula
    int top = lua_gettop(luaL);

    // Nao modifica em nada a pilha
    // recupera o enum referente ao tipo
    // do observer
    int typeObserver = (int)luaL_checkinteger(luaL, -4);
    bool isGraphicType = (typeObserver == TObsDynamicGraphic) || (typeObserver == TObsGraphic);

    //------------------------
    QStringList allAttribs, obsAttribs;

    // Pecorre a pilha lua recuperando todos os atributos celula
    lua_pushnil(luaL);
    while(lua_next(luaL, top) != 0)
    {
        QString key( luaL_checkstring(luaL, -2) );

        allAttribs.push_back(key);
        lua_pop(luaL, 1);
    }

    //------------------------
    // pecorre a pilha lua recuperando
    // os atributos celula que se quer observar
    lua_settop(luaL, top - 1);
    top = lua_gettop(luaL);

    // Verificacao da sintaxe da tabela Atributos
    if(! lua_istable(luaL, top) )
    {
        qFatal("Error: Attributes table not found. Incorrect sintax.\n");
        return -1;
    }

    bool attribTable = false;

    lua_pushnil(luaL);
    while(lua_next(luaL, top - 1 ) != 0)
    {
        QString key( luaL_checkstring(luaL, -1) );
        attribTable = true;

        // Verifica se o atributo informado não existe deve ter sido digitado errado
        if (allAttribs.contains(key))
        {
            obsAttribs.push_back(key);
            if (! observedAttribs.contains(key))
                observedAttribs.push_back(key);
        }
        else
        {
            if ( ! key.isNull() || ! key.isEmpty())
            {
                qFatal("Error: Attribute name '%s' not found.\n", qPrintable(key));
                return -1;
            }
        }
        lua_pop(luaL, 1);
    }
    //------------------------

    //QStringList lines;

    if ((obsAttribs.empty() ) && (! isGraphicType))
    {
        obsAttribs = allAttribs;
        observedAttribs = allAttribs;
    }

    if(! lua_istable(luaL, top) )
    {
        qWarning("Warning: Parameter table not found. Incorrect sintax.");
        return 0;
    }

    QStringList cols;

    // Recupera a tabela de parametros os observadores do tipo Table e Graphic
    // caso não seja um tabela a sintaxe do metodo esta incorreta
    lua_pushnil(luaL);
    while(lua_next(luaL, top) != 0)
    {   
        QString key;
        if (lua_type(luaL, -2) == LUA_TSTRING)
            key = QString( luaL_checkstring(luaL, -2));

        switch (lua_type(luaL, -1))
        {
        case LUA_TSTRING:
            {
                QString value( luaL_checkstring(luaL, -1));
                cols.push_back(value);
                break;
            }

        case LUA_TBOOLEAN:
            {
                bool val = lua_toboolean(luaL, -1);
                if (key == "visible")
                    obsVisible = val;
                else // if (key == "compress")
                    compressDatagram = val;
            }
        default:
            break;
        }
        lua_pop(luaL, 1);
    }

    // Caso não seja definido nenhum parametro,
    // e o observador não é TextScreen então
    // lança um warning
    if ((cols.isEmpty()) && (typeObserver != TObsTextScreen))
    {
        if (! QUIET_MODE )
            qWarning("Warning: The Parameters Table is empty.");
    }
    //------------------------

    ObserverTextScreen *obsText = 0;
    ObserverTable *obsTable = 0;
    ObserverGraphic *obsGraphic = 0;
    ObserverLogFile *obsLog = 0;
    ObserverUDPSender *obsUDPSender = 0;

    int obsId = -1;

    switch (typeObserver)
    {
        case TObsTextScreen			:
            obsText = (ObserverTextScreen*) 
                CellSubjectInterf::createObserver(TObsTextScreen);
            if (obsText)
            {
                obsId = obsText->getId();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", TerraMEObserver::MEMORY_ALLOC_FAILED);
            }
            break;

        case TObsLogFile:
            obsLog = (ObserverLogFile*) 
                CellSubjectInterf::createObserver(TObsLogFile);
            if (obsLog)
            {
                obsId = obsLog->getId();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", TerraMEObserver::MEMORY_ALLOC_FAILED);
            }
            break;

        case TObsTable:
            obsTable = (ObserverTable *) 
                CellSubjectInterf::createObserver(TObsTable);
            obsId = obsTable->getId();
            break;

        case TObsDynamicGraphic:
            obsGraphic = (ObserverGraphic *) 
                CellSubjectInterf::createObserver(TObsDynamicGraphic);
           
            if (obsGraphic)
            {
                obsGraphic->setObserverType(TObsDynamicGraphic);
                obsId = obsGraphic->getId();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", TerraMEObserver::MEMORY_ALLOC_FAILED);
            }
            break;

        case TObsGraphic:
            obsGraphic = (ObserverGraphic *) 
                CellSubjectInterf::createObserver(TObsGraphic);
            if (obsGraphic)
            {
                obsId = obsGraphic->getId();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", TerraMEObserver::MEMORY_ALLOC_FAILED);
            }
            break;

        case TObsUDPSender:
            obsUDPSender = (ObserverUDPSender *) 
                CellSubjectInterf::createObserver(TObsUDPSender);
            if (obsUDPSender)
            {
                obsId = obsUDPSender->getId();
                obsUDPSender->setCompressDatagram(compressDatagram);

                if (obsVisible)
                    obsUDPSender->show();
            }
            else
            {
                if (! QUIET_MODE)
                    qWarning("%s", TerraMEObserver::MEMORY_ALLOC_FAILED);
            }
            break;

        case TObsMap:
        default:
            if (! QUIET_MODE )
            {
                qWarning("Warning: In this context, the code '%s' does not correspond to a "
                         "valid type of Observer.",  getObserverName(typeObserver) );
            }
            return 0;
    }

    //@RODRIGO
    //serverSession->add(obsKey);

    /// Define alguns parametros do observador instanciado ---------------------------------------------------

    if (obsLog)
    {
        obsLog->setHeaders(obsAttribs);

        if (cols.at(0).isNull() || cols.at(0).isEmpty())
        {
            if (! QUIET_MODE )
                qWarning("Warning: Filename was not specified, using a "
                         "default \"%s\".", qPrintable(DEFAULT_NAME));
            obsLog->setFileName(DEFAULT_NAME + ".csv");
        }
        else
        {
            obsLog->setFileName(cols.at(0));
        }

        // caso não seja definido, utiliza o default ";"
        if ((cols.size() < 2) || cols.at(1).isNull() || cols.at(1).isEmpty())
        {
            if (! QUIET_MODE )
                qWarning("Warning: Separator not defined, using \";\".");
            obsLog->setSeparator();
        }
        else
        {
            obsLog->setSeparator(cols.at(1));
        }

        lua_pushnumber(luaL, obsId);
        return 1;
    }

    if (obsText)
    {
        obsText->setHeaders(obsAttribs);
        lua_pushnumber(luaL, obsId);
        return 1;
    }

    if (obsTable)
    {
        if ((cols.size() < 2) || cols.at(0).isNull() || cols.at(0).isEmpty()
                || cols.at(1).isNull() || cols.at(1).isEmpty())
        {
            if (! QUIET_MODE )
                qWarning("Warning: Column title not defined.");
        }

        obsTable->setColumnHeaders(cols);
        obsTable->setLinesHeader(obsAttribs);

        lua_pushnumber(luaL, obsId);
        return 1;
    }

    if (obsGraphic)
    {
        obsGraphic->setLegendPosition();
        if (obsAttribs.size() <= 2)
        {
            obsGraphic->setHeaders(obsAttribs);
        }
        else
        {
            //printf("\nError: This observer works only with one or two elements.\n");
            qFatal("Error: This observer works only with one or two elements.\n");
            return -1;
        }

        // titulo do gráfico
        if (cols.at(0).isNull() || cols.at(0).isEmpty())
        {
            if (! QUIET_MODE )
                qWarning("Warning: Graphic title not defined.");
            obsGraphic->setGraphicTitle();
        }
        else
        {
            obsGraphic->setGraphicTitle(cols.at(0));
        }

        // nome da curva
        if ((cols.size() < 2) || cols.at(1).isNull() || cols.at(1).isEmpty())
        {
            if (! QUIET_MODE )
                qWarning("Warning: Curve name not defined.");
            obsGraphic->setCurveTitle();
        }
        else
        {
            obsGraphic->setCurveTitle(cols.at(1));
        }

        // nome dos eixos
        // FIX-ME: Separar as chamadas do nome dos eixos
        if ( (cols.size() < 3) || (cols.size() < 4) || cols.at(2).isNull() || cols.at(2).isEmpty()
             || cols.at(3).isNull() || cols.at(3).isEmpty() )
        {
            if (! QUIET_MODE )
                qWarning("Warning: Axis name not defined.");
            obsGraphic->setAxisTitle();
        }
        else
        {
            obsGraphic->setAxisTitle(cols.at(2), cols.at(3));
        }

        lua_pushnumber(luaL, obsId);
        return 1;
    }

    if(obsUDPSender)
    {
        obsUDPSender->setAttributes(obsAttribs);

        // if (cols.at(0).isEmpty())
        if (cols.isEmpty())
        {
            if (! QUIET_MODE )
                qWarning("Warning: Port not defined.");
        }
        else
        {
            obsUDPSender->setPort(cols.at(0).toInt());
        }

        // broadcast
        if ((cols.size() == 1) || ((cols.size() == 2) && cols.at(1).isEmpty()) )
        {
            if (! QUIET_MODE )
                qWarning("Warning: Observer will send to broadcast.");
            obsUDPSender->addHost(BROADCAST_HOST);
        }
        else
        {
            // multicast or unicast
            for(int i = 1; i < cols.size(); i++){
                if (! cols.at(i).isEmpty())
                    obsUDPSender->addHost(cols.at(i));
            }
        }
        lua_pushnumber(luaL, obsId);
        return 1;
    }
    return 0;
}
int luaEnvironment::createObserver(lua_State *luaL)
{
    // recupero a referencia da celula
    // @DANIEL
    // lua_rawgeti(luaL, LUA_REGISTRYINDEX, ref);
    Reference<luaEnvironment>::getReference(luaL);

    // flags para a defini??o do uso de compress?o
    // na transmiss?o de datagramas e da visibilidade
    // dos observadores Udp Sender 
    bool compressDatagram = false, obsVisible = true;

    // recupero a tabela de
    // atributos da celula
    int top = lua_gettop(luaL);

    // N?o modifica em nada a pilha
    // recupera o enum referente ao tipo
    // do observer
    TypesOfObservers typeObserver = (TypesOfObservers)luaL_checkinteger(luaL, -4);
    bool isGraphicType = (typeObserver == TObsDynamicGraphic) || (typeObserver == TObsGraphic);

    //------------------------
    QStringList allAttribs, obsAttribs;

    // Pecorre a pilha lua recuperando todos os atributos celula
    lua_pushnil(luaL);
    while(lua_next(luaL, top) != 0)
    {
        QString key; 
 
        if (lua_type(luaL, -2) == LUA_TSTRING) 
        { 
            key  = luaL_checkstring(luaL, -2); 
        } 
        else 
        { 
            if (lua_type(luaL, -2) == LUA_TNUMBER) 
            { 
                char aux[100]; 
                double number = luaL_checknumber(luaL, -2); 
                sprintf(aux, "%g", number); 
                key = aux; 
            } 
        }

        allAttribs.push_back(key);
        lua_pop(luaL, 1);
    }

    //------------------------
    // pecorre a pilha lua recuperando
    // os atributos celula que se quer observar
    lua_settop(luaL, top - 1);
    top = lua_gettop(luaL);

    if(! lua_istable(luaL, top) )
    {
        //printf("\nError: Attributes table not found. Incorrect sintax.\n");
        qFatal("Error: Attributes table not found. Incorrect sintax.\n");
        return -1;
    }

    lua_pushnil(luaL);
    while(lua_next(luaL, top - 1 ) != 0)
    {
        QString key; 
 		 
        if (lua_type(luaL, -1) == LUA_TSTRING) 
        { 
            key = luaL_checkstring(luaL, -1); 
        } 
        else 
        { 
            if (lua_type(luaL, -1) == LUA_TNUMBER) 
            { 
                char aux[100]; 
                double number = luaL_checknumber(luaL, -1); 
                sprintf(aux, "%g", number); 
                key = aux; 
            } 
        } 

        // Verifica se o atributo informado n?o existe deve ter sido digitado errado
        if (allAttribs.contains(key))
        {
            obsAttribs.push_back(key);
            if (! observedAttribs.contains(key))
                observedAttribs.push_back(key);
        }
        else
        {
            if ( ! key.isNull() || ! key.isEmpty())
            {
                
                string err_out = string("Error: Attribute name '" ) + string (qPrintable(key)) + string("' not found.");
				lua_getglobal(L, "customError");
				lua_pushstring(L,err_out.c_str());
				lua_pushnumber(L,5);
				lua_call(L,2,0);
                return -1;
            }
        }
        lua_pop(luaL, 1);
    }

    if ((obsAttribs.empty() ) && (! isGraphicType))
    {
        obsAttribs = allAttribs;
        observedAttribs = allAttribs;
    }

    if(! lua_istable(luaL, top) )
    {
        qFatal("Error: Parameter table not found. Incorrect sintax.");
        return -1;
    }

    QStringList cols, obsParams;

    // Recupera a tabela de parametros os observadores do tipo Table e Graphic
    // caso n?o seja um tabela a sintaxe do metodo esta incorreta
    lua_pushnil(luaL);
    while(lua_next(luaL, top) != 0)
    {   
        QString key;
        if (lua_type(luaL, -2) == LUA_TSTRING)
            key = QString( luaL_checkstring(luaL, -2));

        switch (lua_type(luaL, -1))
        {
        case LUA_TSTRING:
            {
                QString value( luaL_checkstring(luaL, -1));
                cols.push_back(value);
                break;
            }

        case LUA_TBOOLEAN:
            {
                bool val = lua_toboolean(luaL, -1);
                if (key == "visible")
                    obsVisible = val;
                else // if (key == "compress")
                    compressDatagram = val;
            }

		case LUA_TTABLE:
		    {
                int tableTop = lua_gettop(luaL);
                                           
		        lua_pushnil(luaL);
		        while(lua_next(luaL, tableTop) != 0)
                {
		            if (lua_type(luaL, -2) == LUA_TSTRING)
		                obsParams.append(luaL_checkstring(luaL, -2));

		            switch (lua_type(luaL, -1))
                    {
                        case LUA_TNUMBER:
                            cols.append(QString::number(luaL_checknumber(luaL, -1)) );
                            break;
                            
                        case LUA_TSTRING:
		                    cols.append(luaL_checkstring(luaL, -1));
                            break;
                    }
            		lua_pop(luaL, 1);
                }
            }

        default:
            break;
        }
        lua_pop(luaL, 1);
    }

    ObserverTextScreen *obsText = 0;
    ObserverTable *obsTable = 0;
    ObserverGraphic *obsGraphic = 0;
    ObserverLogFile *obsLog = 0;
    ObserverUDPSender *obsUDPSender = 0;

    int obsId = -1;

    switch (typeObserver)
    {
        case TObsTextScreen:
            obsText = (ObserverTextScreen*) 
                EnvironmentSubjectInterf::createObserver(TObsTextScreen);
            if (obsText)
            {
                obsId = obsText->getId();
            }
            else
            {
                if (execModes != Quiet)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsLogFile:
            obsLog = (ObserverLogFile*) 
                EnvironmentSubjectInterf::createObserver(TObsLogFile);
            if (obsLog)
            {
                obsId = obsLog->getId();
            }
            else
            {
                if (execModes != Quiet)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsTable:
            obsTable = (ObserverTable *) 
                EnvironmentSubjectInterf::createObserver(TObsTable);
            if (obsTable)
            {
                obsId = obsTable->getId();
            }
            else
            {
                if (execModes != Quiet)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsDynamicGraphic:
            obsGraphic = (ObserverGraphic *) 
                EnvironmentSubjectInterf::createObserver(TObsDynamicGraphic);
            if (obsGraphic)
            {
                obsGraphic->setObserverType(TObsDynamicGraphic);
                obsId = obsGraphic->getId();
            }
            else
            {
                if (execModes != Quiet)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsGraphic:
            obsGraphic = (ObserverGraphic *) 
                EnvironmentSubjectInterf::createObserver(TObsGraphic);
            if (obsGraphic)
            {
                obsId = obsGraphic->getId();
            }
            else
            {
                if (execModes != Quiet)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        case TObsUDPSender:
            obsUDPSender = (ObserverUDPSender *) 
                EnvironmentSubjectInterf::createObserver(TObsUDPSender);
            if (obsUDPSender)
            {
                obsId = obsUDPSender->getId();
                obsUDPSender->setCompressDatagram(compressDatagram);

                if (obsVisible)
                    obsUDPSender->show();
            }
            else
            {
                if (execModes != Quiet)
                    qWarning("%s", qPrintable(TerraMEObserver::MEMORY_ALLOC_FAILED));
            }
            break;

        default:
            if (execModes != Quiet )
            {
                qWarning("Warning: In this context, the code '%s' does not "
                         "correspond to a valid type of Observer.",  getObserverName(typeObserver) );
            }
            return 0;
    }

    if (obsLog)
    {
        obsLog->setAttributes(obsAttribs);

        if (cols.at(0).isNull() || cols.at(0).isEmpty())
        {
            obsLog->setFileName(DEFAULT_NAME + ".csv");
        }
        else
        {
            obsLog->setFileName(cols.at(0));
        }

        if ((cols.size() < 2) || cols.at(1).isNull() || cols.at(1).isEmpty())
        {
            obsLog->setSeparator();
        }
        else
        {
            obsLog->setSeparator(cols.at(1));
        }

        lua_pushnumber(luaL, obsId);
        return 1;
    }

    if (obsText)
    {
        obsText->setAttributes(obsAttribs);

        lua_pushnumber(luaL, obsId);
        return 1;
    }

    if (obsTable)
    {
        obsTable->setColumnHeaders(cols);
        obsTable->setAttributes(obsAttribs);

        lua_pushnumber(luaL, obsId);
        return 1;
    }

    if (obsGraphic)
    {
        obsGraphic->setLegendPosition();

        // Takes titles of three first locations
        obsGraphic->setTitles(cols.at(0), cols.at(1), cols.at(2));   
        cols.removeFirst(); // remove graphic title
        cols.removeFirst(); // remove axis x title
        cols.removeFirst(); // remove axis y title

        // Splits the attribute labels in the cols list
        obsGraphic->setAttributes(obsAttribs, cols.takeFirst().split(";", QString::SkipEmptyParts),
            obsParams, cols);

		lua_pushnumber(luaL, obsId);
		return 1;
    }

    if (obsUDPSender)
    {
        obsUDPSender->setAttributes(obsAttribs);

        obsUDPSender->setPort(cols.at(0).toInt());

        // broadcast
        if ((cols.size() == 1) || ((cols.size() == 2) && cols.at(1).isEmpty()) )
        {
            obsUDPSender->addHost(BROADCAST_HOST);
        }
        else
        {
            // multicast or unicast
            for(int i = 1; i < cols.size(); i++)
            {
                if (! cols.at(i).isEmpty())
                    obsUDPSender->addHost(cols.at(i));
            }
        }
        lua_pushnumber(luaL, obsId);
        return 1;
    }
    return 0;
}