00001
00002
00003
00004
00005
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() )
00080 {
00081
00082 alpha1 = it->second.doubleValue();
00083 coreEV << "createPathLossModel(): alpha1 set from config.xml to " << alpha1 << endl;
00084
00085 if(cc->hasPar("alpha") && alpha1 < cc->par("alpha").doubleValue())
00086 {
00087
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() )
00103 {
00104
00105 alpha2 = it->second.doubleValue();
00106 coreEV << "createPathLossModel(): alpha2 set from config.xml to " << alpha2 << endl;
00107
00108 if(cc->hasPar("alpha") && alpha2 < cc->par("alpha").doubleValue())
00109 {
00110
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() )
00117 {
00118 breakpointDistance = it->second.doubleValue();
00119 coreEV << "createPathLossModel(): breakpointDistance set from config.xml to " << alpha2 << endl;
00120
00121 }
00122
00123
00124 it = params.find("carrierFrequency");
00125
00126 if ( it != params.end() )
00127 {
00128
00129 carrierFrequency = it->second.doubleValue();
00130 coreEV << "createPathLossModel(): carrierFrequency set from config.xml to " << carrierFrequency << endl;
00131
00132
00133 if(cc->hasPar("carrierFrequency") && carrierFrequency < cc->par("carrierFrequency").doubleValue())
00134 {
00135
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
00141 {
00142 if (cc->hasPar("carrierFrequency"))
00143 {
00144
00145 carrierFrequency = cc->par("carrierFrequency").doubleValue();
00146 coreEV << "createPathLossModel(): carrierFrequency set from ConnectionManager to " << carrierFrequency << endl;
00147 }
00148 else
00149 {
00150
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
00166 double alpha = 3.5;
00167 double carrierFrequency = 2.412e+9;
00168 bool useTorus = world->useTorus();
00169 const Coord& playgroundSize = *(world->getPgs());
00170
00171
00172 ParameterMap::iterator it = params.find("alpha");
00173
00174 if ( it != params.end() )
00175 {
00176
00177 alpha = it->second.doubleValue();
00178 coreEV << "createPathLossModel(): alpha set from config.xml to " << alpha << endl;
00179
00180
00181 if(cc->hasPar("alpha") && alpha < cc->par("alpha").doubleValue())
00182 {
00183
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
00189 {
00190 if (cc->hasPar("alpha"))
00191 {
00192
00193 alpha = cc->par("alpha").doubleValue();
00194 coreEV << "createPathLossModel(): alpha set from ConnectionManager to " << alpha << endl;
00195 }
00196 else
00197 {
00198
00199 coreEV << "createPathLossModel(): alpha set from default value to " << alpha << endl;
00200 }
00201 }
00202
00203
00204 it = params.find("carrierFrequency");
00205
00206 if ( it != params.end() )
00207 {
00208
00209 carrierFrequency = it->second.doubleValue();
00210 coreEV << "createPathLossModel(): carrierFrequency set from config.xml to " << carrierFrequency << endl;
00211
00212
00213 if(cc->hasPar("carrierFrequency") && carrierFrequency < cc->par("carrierFrequency").doubleValue())
00214 {
00215
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
00221 {
00222 if (cc->hasPar("carrierFrequency"))
00223 {
00224
00225 carrierFrequency = cc->par("carrierFrequency").doubleValue();
00226 coreEV << "createPathLossModel(): carrierFrequency set from ConnectionManager to " << carrierFrequency << endl;
00227 }
00228 else
00229 {
00230
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 }