PhyLayer.cc

00001 /*
00002  * PhyLayer.cc
00003  *
00004  *  Created on: 11.02.2009
00005  *      Author: karl
00006  */
00007 
00008 #include "PhyLayer.h"
00009 #include <Decider80211.h>
00010 #include <Decider802154Narrow.h>
00011 #include <SimplePathlossModel.h>
00012 #include <BreakpointPathlossModel.h>
00013 #include <LogNormalShadowing.h>
00014 #include <SNRThresholdDecider.h>
00015 #include <JakesFading.h>
00016 #include <PERModel.h>
00017 
00018 Define_Module(PhyLayer);
00019 
00020 AnalogueModel* PhyLayer::getAnalogueModelFromName(std::string name, ParameterMap& params) {
00021 
00022   if (name == "SimplePathlossModel")
00023   {
00024     return initializeSimplePathlossModel(params);
00025   }
00026   else if (name == "LogNormalShadowing")
00027   {
00028     return initializeLogNormalShadowing(params);
00029   }
00030   else if (name == "JakesFading")
00031   {
00032     return initializeJakesFading(params);
00033   }
00034   else if(name == "BreakpointPathlossModel")
00035   {
00036     return initializeBreakpointPathlossModel(params);
00037   } else if(name == "PERModel")
00038   {
00039     return initializePERModel(params);
00040   }
00041   return BasePhyLayer::getAnalogueModelFromName(name, params);
00042 }
00043 
00044 AnalogueModel* PhyLayer::initializeLogNormalShadowing(ParameterMap& params){
00045   double mean = params["mean"].doubleValue();
00046   double stdDev = params["stdDev"].doubleValue();
00047   simtime_t interval = params["interval"].doubleValue();
00048 
00049   return new LogNormalShadowing(mean, stdDev, interval);
00050 }
00051 
00052 AnalogueModel* PhyLayer::initializeJakesFading(ParameterMap& params){
00053   int fadingPaths = params["fadingPaths"].longValue();
00054   simtime_t delayRMS = params["delayRMS"].doubleValue();
00055   simtime_t interval = params["interval"].doubleValue();
00056 
00057   double carrierFrequency = 2.412e+9;
00058   if(params.count("carrierFrequency") > 0) {
00059     carrierFrequency = params["carrierFrequency"];
00060   }
00061   else {
00062     if (cc->hasPar("carrierFrequency")) {
00063       carrierFrequency = cc->par("carrierFrequency").doubleValue();
00064     }
00065   }
00066 
00067   return new JakesFading(fadingPaths, delayRMS, &move, carrierFrequency, interval);
00068 }
00069 
00070 AnalogueModel* PhyLayer::initializeBreakpointPathlossModel(ParameterMap& params) {
00071   double alpha1 =-1, alpha2=-1, breakpointDistance=-1;
00072   double L01=-1, L02=-1;
00073   double carrierFrequency = 2.412e+9;
00074   bool useTorus = world->useTorus();
00075   const Coord& playgroundSize = *(world->getPgs());
00076   ParameterMap::iterator it;
00077 
00078   it = params.find("alpha1");
00079   if ( it != params.end() ) // parameter alpha1 has been specified in config.xml
00080   {
00081     // set alpha1
00082     alpha1 = it->second.doubleValue();
00083     coreEV << "createPathLossModel(): alpha1 set from config.xml to " << alpha1 << endl;
00084     // check whether alpha is not smaller than specified in ConnectionManager
00085     if(cc->hasPar("alpha") && alpha1 < cc->par("alpha").doubleValue())
00086     {
00087           // throw error
00088       opp_error("TestPhyLayer::createPathLossModel(): alpha can't be smaller than specified in \
00089                  ConnectionManager. Please adjust your config.xml file accordingly");
00090     }
00091   }
00092   it = params.find("L01");
00093   if(it != params.end()) {
00094     L01 = it->second.doubleValue();
00095   }
00096   it = params.find("L02");
00097   if(it != params.end()) {
00098     L02 = it->second.doubleValue();
00099   }
00100 
00101   it = params.find("alpha2");
00102   if ( it != params.end() ) // parameter alpha1 has been specified in config.xml
00103   {
00104     // set alpha2
00105     alpha2 = it->second.doubleValue();
00106     coreEV << "createPathLossModel(): alpha2 set from config.xml to " << alpha2 << endl;
00107     // check whether alpha is not smaller than specified in ConnectionManager
00108     if(cc->hasPar("alpha") && alpha2 < cc->par("alpha").doubleValue())
00109     {
00110           // throw error
00111       opp_error("TestPhyLayer::createPathLossModel(): alpha can't be smaller than specified in \
00112                  ConnectionManager. Please adjust your config.xml file accordingly");
00113     }
00114   }
00115   it = params.find("breakpointDistance");
00116   if ( it != params.end() ) // parameter alpha1 has been specified in config.xml
00117   {
00118     breakpointDistance = it->second.doubleValue();
00119     coreEV << "createPathLossModel(): breakpointDistance set from config.xml to " << alpha2 << endl;
00120     // check whether alpha is not smaller than specified in ConnectionManager
00121   }
00122 
00123   // get carrierFrequency from config
00124   it = params.find("carrierFrequency");
00125 
00126   if ( it != params.end() ) // parameter carrierFrequency has been specified in config.xml
00127   {
00128     // set carrierFrequency
00129     carrierFrequency = it->second.doubleValue();
00130     coreEV << "createPathLossModel(): carrierFrequency set from config.xml to " << carrierFrequency << endl;
00131 
00132     // check whether carrierFrequency is not smaller than specified in ConnectionManager
00133     if(cc->hasPar("carrierFrequency") && carrierFrequency < cc->par("carrierFrequency").doubleValue())
00134     {
00135       // throw error
00136       opp_error("TestPhyLayer::createPathLossModel(): carrierFrequency can't be smaller than specified in \
00137                  ConnectionManager. Please adjust your config.xml file accordingly");
00138     }
00139   }
00140   else // carrierFrequency has not been specified in config.xml
00141   {
00142     if (cc->hasPar("carrierFrequency")) // parameter carrierFrequency has been specified in ConnectionManager
00143     {
00144       // set carrierFrequency according to ConnectionManager
00145       carrierFrequency = cc->par("carrierFrequency").doubleValue();
00146       coreEV << "createPathLossModel(): carrierFrequency set from ConnectionManager to " << carrierFrequency << endl;
00147     }
00148     else // carrierFrequency has not been specified in ConnectionManager
00149     {
00150       // keep carrierFrequency at default value
00151       coreEV << "createPathLossModel(): carrierFrequency set from default value to " << carrierFrequency << endl;
00152     }
00153   }
00154 
00155   if(alpha1 ==-1 || alpha2==-1 || breakpointDistance==-1 || L01==-1 || L02==-1) {
00156     opp_error("Undefined parameters for breakpointPathlossModel. Please check your configuration.");
00157   }
00158 
00159   return new BreakpointPathlossModel(L01, L02, alpha1, alpha2, breakpointDistance, carrierFrequency, &move, useTorus, playgroundSize, coreDebug);
00160 
00161 }
00162 
00163 AnalogueModel* PhyLayer::initializeSimplePathlossModel(ParameterMap& params){
00164 
00165   // init with default value
00166   double alpha = 3.5;
00167   double carrierFrequency = 2.412e+9;
00168   bool useTorus = world->useTorus();
00169   const Coord& playgroundSize = *(world->getPgs());
00170 
00171   // get alpha-coefficient from config
00172   ParameterMap::iterator it = params.find("alpha");
00173 
00174   if ( it != params.end() ) // parameter alpha has been specified in config.xml
00175   {
00176     // set alpha
00177     alpha = it->second.doubleValue();
00178     coreEV << "createPathLossModel(): alpha set from config.xml to " << alpha << endl;
00179 
00180     // check whether alpha is not smaller than specified in ConnectionManager
00181     if(cc->hasPar("alpha") && alpha < cc->par("alpha").doubleValue())
00182     {
00183           // throw error
00184       opp_error("TestPhyLayer::createPathLossModel(): alpha can't be smaller than specified in \
00185                  ConnectionManager. Please adjust your config.xml file accordingly");
00186     }
00187   }
00188   else // alpha has not been specified in config.xml
00189   {
00190     if (cc->hasPar("alpha")) // parameter alpha has been specified in ConnectionManager
00191     {
00192       // set alpha according to ConnectionManager
00193       alpha = cc->par("alpha").doubleValue();
00194       coreEV << "createPathLossModel(): alpha set from ConnectionManager to " << alpha << endl;
00195     }
00196     else // alpha has not been specified in ConnectionManager
00197     {
00198       // keep alpha at default value
00199       coreEV << "createPathLossModel(): alpha set from default value to " << alpha << endl;
00200     }
00201   }
00202 
00203   // get carrierFrequency from config
00204   it = params.find("carrierFrequency");
00205 
00206   if ( it != params.end() ) // parameter carrierFrequency has been specified in config.xml
00207   {
00208     // set carrierFrequency
00209     carrierFrequency = it->second.doubleValue();
00210     coreEV << "createPathLossModel(): carrierFrequency set from config.xml to " << carrierFrequency << endl;
00211 
00212     // check whether carrierFrequency is not smaller than specified in ConnectionManager
00213     if(cc->hasPar("carrierFrequency") && carrierFrequency < cc->par("carrierFrequency").doubleValue())
00214     {
00215       // throw error
00216       opp_error("TestPhyLayer::createPathLossModel(): carrierFrequency can't be smaller than specified in \
00217                  ConnectionManager. Please adjust your config.xml file accordingly");
00218     }
00219   }
00220   else // carrierFrequency has not been specified in config.xml
00221   {
00222     if (cc->hasPar("carrierFrequency")) // parameter carrierFrequency has been specified in ConnectionManager
00223     {
00224       // set carrierFrequency according to ConnectionManager
00225       carrierFrequency = cc->par("carrierFrequency").doubleValue();
00226       coreEV << "createPathLossModel(): carrierFrequency set from ConnectionManager to " << carrierFrequency << endl;
00227     }
00228     else // carrierFrequency has not been specified in ConnectionManager
00229     {
00230       // keep carrierFrequency at default value
00231       coreEV << "createPathLossModel(): carrierFrequency set from default value to " << carrierFrequency << endl;
00232     }
00233   }
00234 
00235   return new SimplePathlossModel(alpha, carrierFrequency, &move, useTorus, playgroundSize, coreDebug);
00236 
00237 }
00238 
00239 AnalogueModel* PhyLayer::initializePERModel(ParameterMap& params) {
00240   double per = params["packetErrorRate"].doubleValue();
00241   return new PERModel(per);
00242 }
00243 
00244 Decider* PhyLayer::getDeciderFromName(std::string name, ParameterMap& params) {
00245   if(name == "Decider80211") {
00246     protocolId = IEEE_80211;
00247     return initializeDecider80211(params);
00248   }
00249   else if(name == "SNRThresholdDecider"){
00250     protocolId = GENERIC;
00251     return initializeSNRThresholdDecider(params);
00252   }
00253   else if(name == "Decider802154Narrow") {
00254     protocolId = IEEE_802154_NARROW;
00255     return initializeDecider802154Narrow(params);
00256   }
00257 
00258   return BasePhyLayer::getDeciderFromName(name, params);
00259 }
00260 
00261 Decider* PhyLayer::initializeDecider80211(ParameterMap& params) {
00262   double threshold = params["threshold"];
00263   return new Decider80211(this, threshold, sensitivity,
00264               radio->getCurrentChannel(),
00265               findHost()->getIndex(), coreDebug);
00266 }
00267 
00268 Decider* PhyLayer::initializeDecider802154Narrow(ParameterMap& params) {
00269   int sfdLength = params["sfdLength"];
00270   double berLowerBound = params["berLowerBound"];
00271   std::string modulation = params["modulation"].stringValue();
00272   return new Decider802154Narrow(this, findHost()->getIndex(), coreDebug, sfdLength, berLowerBound, modulation, headerLength, recordStats);
00273 }
00274 
00275 Decider* PhyLayer::initializeSNRThresholdDecider(ParameterMap& params)
00276 {
00277   double snrThreshold = 0;
00278   if(params.count("snrThreshold") == 1) {
00279     snrThreshold = params["snrThreshold"];
00280   }
00281   else if(params.count("threshold") == 1) {
00282     snrThreshold = params["threshold"];
00283   }
00284   else {
00285     opp_warning("No SNR threshold defined in config.xml for Decider!");
00286   }
00287 
00288   double busyThreshold = sensitivity;
00289   if(params.count("busyThreshold") == 0) {
00290     ev << "No busy threshold defined for SNRThresholdDecider. Using"
00291        << " phy layers sensitivity as busy threshold." << endl;
00292   } else {
00293     busyThreshold = params["busyThreshold"];
00294   }
00295 
00296   return new SNRThresholdDecider(this, snrThreshold,
00297                    sensitivity, busyThreshold,
00298                    findHost()->getIndex(), coreDebug);
00299 }