SamplePhyLayer.cc

00001 #include "SamplePhyLayer.h"
00002 
00003 #include "ThresholdDecider.h"
00004 #include "RandomFreqTimeModel.h"
00005 #include "RandomFrequencyOnlyModel.h"
00006 
00007 Define_Module(SamplePhyLayer);
00008 
00009 
00010 void SamplePhyLayer::initialize(int stage) {
00011   //call BasePhy's initialize
00012   PhyLayer::initialize(stage);
00013 
00014   if(stage == 0) {
00015     myIndex = findHost()->getIndex();
00016 
00017   } else if(stage == 1) {
00018     //Decider and AnalogueModels are created by the PhyLayer in this stage
00019   }
00020 }
00021 
00022 void SamplePhyLayer::handleMessage(cMessage* msg) {
00023   if(msg->getKind() == AIR_FRAME) {
00024     AirFrame* frame = static_cast<AirFrame*>(msg);
00025 
00026     //normally a subclassed phylayer doesn't has to care about these
00027     //events, we only catch them to display some messages telling the
00028     //current state of the receiving process
00029     switch(frame->getState()) {
00030     case START_RECEIVE:
00031       if(frame->getSignal().getSignalStart() != simTime())
00032         log("Received delayed AirFrame (state=START_RECEIVE). Proceeding it directly to RECEIVING state");
00033       else
00034         log("Received AirFrame (state=START_RECEIVE). Proceeding it directly to RECEIVING state");
00035       break;
00036 
00037     case RECEIVING:
00038       log("Received scheduled AirFrame for further processing through the decider.");
00039       break;
00040 
00041     case END_RECEIVE:
00042       log("Last receive of scheduled AirFrame because AirFrame transmission is over. (state=END_RECEIVE");
00043       break;
00044 
00045     default:
00046       break;
00047     }
00048   }
00049 
00050   //IF a subclass of PhyLayer overrides the handleMessage method it should
00051   //make sure to call the base method.
00052   PhyLayer::handleMessage(msg);
00053 }
00054 
00055 void SamplePhyLayer::log(std::string msg) {
00056   ev << "[Host " << myIndex << "] - PhyLayer: " << msg << endl;
00057 }
00058 
00063 AnalogueModel* SamplePhyLayer::createRandomFreqTimeModel(ParameterMap& params){
00064 
00065   //get the "seed"-parameter from the config
00066   ParameterMap::iterator it = params.find("seed");
00067 
00068   //create AnalogueModel with default seed if no seed parameter was defined
00069   if(it == params.end()){
00070     return new RandomFreqTimeModel();
00071   }
00072 
00073   long seed = it->second.longValue();
00074   return new RandomFreqTimeModel(seed);
00075 
00076 }
00077 
00082 AnalogueModel* SamplePhyLayer::createRandomFrequencyOnlyModel(ParameterMap& params){
00083 
00084   //get the "seed"-parameter from the config
00085   ParameterMap::iterator it = params.find("seed");
00086 
00087   //create AnalogueModel with default seed if no seed parameter was defined
00088   if(it == params.end()){
00089     return new RandomFrequencyOnlyModel();
00090   }
00091 
00092   long seed = it->second.longValue();
00093   return new RandomFrequencyOnlyModel(seed);
00094 
00095 }
00096 
00097 AnalogueModel* SamplePhyLayer::getAnalogueModelFromName(std::string name, ParameterMap& params) {
00098 
00099   if(name == "RandomFreqTimeModel")
00100     return createRandomFreqTimeModel(params);
00101   else if(name == "RandomFrequencyOnlyModel")
00102     return createRandomFrequencyOnlyModel(params);
00103 
00104   //If we couldn't create the passed analogue model, call the method
00105   //of our base class.
00106   //Note: even if all models defined in the xml-config can be handled
00107   //by this class method, there will be at least the call to create
00108   //the RadioStateAnalogueModel which in almost every case has to be done
00109   //by the PhyLayer.
00110   return PhyLayer::getAnalogueModelFromName(name, params);
00111 }
00112 
00113 Decider* SamplePhyLayer::getDeciderFromName(std::string name, ParameterMap& params) {
00114 
00115   if(name == "ThresholdDecider"){
00116     ParameterMap::iterator it = params.find("threshold");
00117     if(it == params.end()){
00118       log("ERROR: No threshold parameter defined for ThresholdDecider!");
00119       return 0;
00120     }
00121 
00122     /*
00123      * The value for the deciders threshold should be checked here against
00124      * the value specified in ConnectionManager that stores the max/min valid value.
00125      *
00126      */
00127 
00128     return new ThresholdDecider(this, myIndex, it->second.doubleValue());
00129   }
00130 
00131   return 0;
00132 }