Skip to content
Snippets Groups Projects
AE.cpp 4.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • Luigi Liquori's avatar
    Luigi Liquori committed
    #include "AE.h"
    #include "discoveryMessage_m.h"
    #include "utils.h"
    #include "types.h"
    #include <iostream>
    
    int AE::numInitStages() const {
        return 2;
    }
    
    void AE::registration() {
        this->queryIndex = 0;
        this->warmup = par("warmup");
        // get the id of the AE
        URI = getId(); // this is the omnet id which is given when creating the module in the NED file (sequential numbering )
        // assigning randomly the data
        data = uniform(0, 100);
        int ran_number = std::rand() % 100;
        EV << "Random Number" << ran_number << "\n";
        // maxhop set to 10
        maxHop = par("maxHops");
        resource_pool_size = par("resource_pool_size");
        this->feature_type = std::to_string(std::rand() % resource_pool_size).c_str();
    
        // send an AE message with op_code Registration
        sendAEMessage(REGISTRATION);
    //
    //    if (getIndex() % 5 == 1) {
    //        sendAEMessage(CANCELLATION);
    //    }
    }
    
    void AE::sendQuery() {
        // getIndex is an omnet function that select in  a vector of AE (in this case ) the index in the vector table.
        if ((std::rand() % 5) == 1) {
            // send the AE message with op_code QUERY
    //        EV << "AE of URI 28 is Searching for waterValve" << "\n";
            sendAEMessage(QUERY);
        }
        if ((std::rand() % 15) == 1) {
                // send the AE message with op_code QUERY
        //        EV << "AE of URI 28 is Searching for waterValve" << "\n";
                sendAEMessage(CANCELLATION);
            }
    
    
    
    }
    
    void AE::initialize(int stage) {
        number_of_replies = 0;
        successRate = registerSignal("number_replies");
        switch (stage) {
        case InitStage::INIT_REGISTRATION:
            registration();
            break;
        case InitStage::INIT_QUERY:
            sendQuery();
            break;
        default: {
            EV_FATAL << "Unknown initialization phase!\n";
            break;
        }
        }
    } // end of initialize
    
    void AE::sendAEMessage(int op_code) {
        // this function we set the fields of an AEMessage with respect to op_code
        switch (op_code) {
        case CANCELLATION: {
            AEMessage *regMsg = new AEMessage("C");
            // set the message fields
            regMsg->setURI(URI);
            regMsg->setData(data);
            regMsg->setOp_code(CANCELLATION);
            regMsg->setFeature_type(feature_type.c_str());
            //send to the output gate of the AE $o as output and 0 is the number
            sendDelayed(regMsg, simTime() + this->warmup + (std::rand()%5), "cse$o", 0);
            break;
        }
        case REGISTRATION: {
            AEMessage *regMsg = new AEMessage("Rg");
            // set the message fields
            regMsg->setURI(URI);
            regMsg->setFeature_type(feature_type.c_str());
            regMsg->setData(data);
            regMsg->setOp_code(REGISTRATION);
            SimTime t;
            t.setRaw(1);
            //send to the output gate of the AE $o as output and 0 is the number
            sendDelayed(regMsg, simTime() + exponential(t), "cse$o", 0);
            break;
        } // end of REGISTRATION case
        case QUERY: {
            AEMessage *queryMsg = new AEMessage("Q");
            queryMsg->setURI(URI);
            queryMsg->setQueryID(queryIndex++);
            queryMsg->setFeature_type(std::to_string(std::rand() % resource_pool_size).c_str());
            queryMsg->setOp_code(QUERY);
            queryMsg->setMaxHop(maxHop);
    
            sendDelayed(queryMsg, simTime() + this->warmup, "cse$o", 0);
            break;
        } // end of QUERY case
    
        default:
            break;
        } // end of switch
    
    } // end of function sendAEMessage
    
    void AE::handleMessage(cMessage *msg) {
        static int NumOfReplies = 0;
        //AE will receive the response
        //AEMessage *responseMsg = check_and_cast<AEMessage *>(msg);
        discoveryMessage *responseMsg = check_and_cast<discoveryMessage*>(msg);
        EV << "AE receives a response" << "\n";
        int number_of_response=0;
        number_of_response++;
    
        if (responseMsg->getReturnCode() == ResultCode::SUCCESS) {
            number_of_successfulResponse= 0;
            number_of_successfulResponse++;
    
            EV << "Resource of type " << responseMsg->getFeature_type()
                      << " found in " << responseMsg->getURI_init() << "\n";
    
        }
    
        if (responseMsg->getReturnCode() == ResultCode::NOT_FOUND) {
    
            EV << "Resource of type " << responseMsg->getFeature_type()
                      << " not found in" << responseMsg->getURI_init() << "\n";
        }
    
        number_of_replies++;
        emit(successRate, number_of_replies);
        delete responseMsg;
    }