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 }