Symulacja sieci - problem z zalinkowaniem modułu

0

Bazując na tutorialu: http://www.omnetpp.org/doc/omnetpp/tictoc-tutorial/part1.html próbuję w Omnet++ zaimplementować sieć dwupierścieniową.

W folderze simulations znajduje się plik Ring.ned:

package temida.simulations;
import temida.Host;

network Ring
{
    submodules:
        node0: Host;
        node1: Host;
        node2: Host;
        node3: Host;
        node4: Host;
        node5: Host;
        node6: Host;
        node7: Host;
        node8: Host;
        node9: Host;
        node10: Host;
        node11: Host;
        
    connections:
        node0.outCC --> node11.inCC;
        node1.outCC --> node0.inCC;
        node2.outCC --> node1.inCC;
        node3.outCC --> node2.inCC;
        node4.outCC --> node3.inCC;
        node5.outCC --> node4.inCC;
        node6.outCC --> node5.inCC;
        node7.outCC --> node6.inCC;
        node8.outCC --> node7.inCC;
        node9.outCC --> node8.inCC;
        node10.outCC --> node9.inCC;
        node11.outCC --> node10.inCC;
        
        node0.outC --> node1.inC;
        node1.outC --> node2.inC;
        node2.outC --> node3.inC;
        node3.outC --> node4.inC;
        node4.outC --> node5.inC;
        node5.outC --> node6.inC;
        node6.outC --> node7.inC;
        node7.outC --> node8.inC;
        node8.outC --> node9.inC;
        node9.outC --> node10.inC;
        node10.outC --> node11.inC;
        node11.outC --> node0.inC;        
}

Host.ned znajduje się w folderze src:

package temida;

simple Host
{
    parameters:
         bool sendInitialMessage = default(false);
	
	gates:
        input inC;
        input inCC;
        output outC;
        output outCC;
}

Host.h

#ifndef HOST_H_
#define HOST_H_

#include <omnetpp.h>

namespace temida {

class Host : public cSimpleModule {
protected:
    virtual void initialize();
    virtual void handleMessage(cMessage *msg);
};

}; /* namespace temida */
#endif /* HOST_H_ */

Host.cpp

#include "Host.h"

namespace temida
{
    Define_Module(Host);

    void Host::initialize()
    {
        if (par("sendInitialMessage").boolValue())
        {
            cMessage *msg1 = new cMessage("message C");
            send(msg, "outC");

            cMessage *msg2 = new cMessage("message CC");
            send(msg, "outCC");
        }
    }

    void Host::handleMessage(cMessage *msg)
    {
        cGate *inGate = msg->getSenderGate();
        if (inGate->getBaseName() == "inCC")
        {
            send(msg, "outCC");
        }
        else
        {
            send(msg, "outC");
        }
    }
};

Logika sieci nie jest istotna na tym etapie, ale żeby króciutko streścić - każdy Host ma dwie bramki wejściowe i dwie wyjściowe. Co stacja dostanie na wejściu, przekazuje od razu na wyjście z drugiej strony. Oznaczenia C i CC oznaczają clockwise i counterclockwise. Każda stacja zaraz po zainicjowaniu wysyła po jednym pakiecie na każdy pierścień.

Niestety, zamiast tego działania, otrzymuję błąd przy uruchomieniu symulacji:
user image

W makefile'u są wpisy dotyczące klasy Host, takie same jak w analogicznym projekcie TicToc dla klasy Txc. Define_Module() znajduje się, gdzie powinien się znajdować... W IDE wszystko wygląda ok, działają podpowiedzi i "go to declaration" odsyła tam gdzie trzeba...
Próbowałam już najpopularniejszej odpowiedzi z google'a - clean project ;) Nie pomogło.

0

Trochę sobie kombinuję, licząc na to, że dojdę o co kaman. Symulacja zadziałała, gdy node'y zrobiłam typu Txc (z przykładu TicToc) i zmieniłam connections na odpowiednie dla buforów in i out. Oryginalny plik Txc.ned:

package temida;

simple Txc
{
    parameters:
        bool sendInitialMessage = default(false);
    gates:
        input in;
        output out;
}

Następnie zmodyfikowałam pliki odpowiednio:

Txc.ned

package temida;

//
// Immediately sends out any message it receives. It can optionally generate
// a message at the beginning of the simulation, to bootstrap the process.
//
simple Txc
{
    parameters:
        bool sendInitialMessage = default(false);
    gates:
        input inC;
        input inCC;
        output outC;
        output outCC;
}

Txc.cpp

#include "Txc.h"

namespace temida {

    Define_Module(Txc);

    void Txc::initialize()
    {
        if (par("sendInitialMessage").boolValue())
        {
            cMessage *msg1 = new cMessage("message C");
            send(msg, "outC");

            cMessage *msg2 = new cMessage("message CC");
            send(msg, "outCC");
        }
    }

    void Txc::handleMessage(cMessage *msg)
    {
        //dla uproszczenia
        send(msg, "outCC");
    }

}; // namespace

Txc.h

//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.
// 
// You should have received a copy of the GNU Lesser General Public License
// along with this program.  If not, see http://www.gnu.org/licenses/.
// 

#ifndef __TEMIDA_TCX_H
#define __TEMIDA_TCX_H

#include <omnetpp.h>

namespace temida {
class Txc : public cSimpleModule
{
  protected:
    virtual void initialize();
    virtual void handleMessage(cMessage *msg);
};

}; // namespace

#endif

Ring.ned dokładnie taki jak był dla Host, tylko tam gdzie tamten miał wpisane Host, ten ma Txc.

I tak skonfigurowana symulacja daje taki oto efekt:
user image

No to ja się pytam - a skąd on niby bierze ten gate vector 'out'? Jak zmieniłam nazwę output 'outC' na 'out', to symulacja ruszyła... No ale kurczę, skąd to się bierze? Przeszukałam cały projekt pod kątem słowa 'out', nie znalazłam nic ciekawego.

1

W końcu stworzyłam nowy projekt, dodałam po kolei tylko takie pliki, jakie mnie interesują, od razu takie bramki, jak mnie interesują, wszystko w jednym folderze, kompiluję - to samo! (tzn. błąd z pierwszego posta, could not find class).
Pomogło usunięcie namespace'ów...

1 użytkowników online, w tym zalogowanych: 0, gości: 1