User Manual, Developers Guide and API Documentation

FCFSMaxPhyMode.cpp

Go to the documentation of this file.
00001 /*******************************************************************************
00002  * This file is part of openWNS (open Wireless Network Simulator)
00003  * _____________________________________________________________________________
00004  *
00005  * Copyright (C) 2004-2009
00006  * Chair of Communication Networks (ComNets)
00007  * Kopernikusstr. 5, D-52074 Aachen, Germany
00008  * phone: ++49-241-80-27910,
00009  * fax: ++49-241-80-22242
00010  * email: info@openwns.org
00011  * www: http://www.openwns.org
00012  * _____________________________________________________________________________
00013  *
00014  * openWNS is free software; you can redistribute it and/or modify it under the
00015  * terms of the GNU Lesser General Public License version 2 as published by the
00016  * Free Software Foundation;
00017  *
00018  * openWNS is distributed in the hope that it will be useful, but WITHOUT ANY
00019  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
00020  * A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
00021  * details.
00022  *
00023  * You should have received a copy of the GNU Lesser General Public License
00024  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
00025  *
00026  ******************************************************************************/
00027 
00028 #include <WNS/scheduler/strategy/apcstrategy/FCFSMaxPhyMode.hpp>
00029 #include <WNS/scheduler/strategy/apcstrategy/APCStrategy.hpp>
00030 #include <WNS/scheduler/strategy/StrategyInterface.hpp>
00031 #include <WNS/scheduler/SchedulerTypes.hpp>
00032 #include <vector>
00033 #include <iostream>
00034 #include <algorithm>
00035 
00036 using namespace wns::scheduler;
00037 using namespace wns::scheduler::strategy;
00038 using namespace wns::scheduler::strategy::apcstrategy;
00039 
00040 STATIC_FACTORY_REGISTER_WITH_CREATOR(FCFSMaxPhyMode,
00041                                      APCStrategyInterface,
00042                                      "FCFSMaxPhyMode",
00043                                      wns::PyConfigViewCreator);
00044 
00045 FCFSMaxPhyMode::FCFSMaxPhyMode(const wns::pyconfig::View& config)
00046     : APCStrategy(config)
00047 {
00048 }
00049 
00050 FCFSMaxPhyMode::~FCFSMaxPhyMode()
00051 {
00052 }
00053 
00054 // called before each timeSlot/frame
00055 void
00056 FCFSMaxPhyMode::initialize(SchedulerStatePtr schedulerState,
00057                            SchedulingMapPtr schedulingMap)
00058 {
00059     APCStrategy::initialize(schedulerState,schedulingMap); // must always initialize base class too
00060     MESSAGE_SINGLE(NORMAL, logger, "UseNominalTxPower::initialize("<<apcstrategyName<<")");
00061 } // initialize
00062 
00063 APCResult
00064 FCFSMaxPhyMode::doStartAPC(RequestForResource& request,
00065                            SchedulerStatePtr schedulerState,
00066                            SchedulingMapPtr schedulingMap)
00067 {
00068     APCResult apcResult;
00069     wns::scheduler::PowerCapabilities powerCapabilities =
00070         schedulerState->strategy->getPowerCapabilities(request.user);
00071 
00072     wns::Ratio pathloss     = request.cqiOnSubChannel.pathloss;
00073     wns::Power interference = request.cqiOnSubChannel.interference;
00074 
00075     assure(request.subChannel>=0,"need a valid subChannel");
00076     assure(request.timeSlot  >=0,"need a valid timeSlot");
00077 
00078     if (schedulerState->defaultTxPower!=wns::Power())
00079     { // predefined, e.g. in slave mode
00080         apcResult.txPower = schedulerState->defaultTxPower;
00081         apcResult.sinr = apcResult.txPower/(interference*pathloss);
00082         apcResult.estimatedCandI = wns::CandI(apcResult.txPower/pathloss,interference);
00083         apcResult.phyModePtr = schedulerState->defaultPhyModePtr;
00084     } else {
00085         wns::Power totalPower = powerCapabilities.maxOverall;
00086         wns::Power remainingTxPowerOnAllSubChannels = schedulingMap->getRemainingPower(totalPower,request.timeSlot);
00087 
00088         if (remainingTxPowerOnAllSubChannels == wns::Power())
00089         { // no more power left
00090             apcResult.txPower = wns::Power();
00091             return apcResult;
00092         }
00093 
00094         wns::Power maxPowerPerSubChannel = powerCapabilities.maxPerSubband;
00095         wns::Power maxTxPower =  (maxPowerPerSubChannel > remainingTxPowerOnAllSubChannels ? remainingTxPowerOnAllSubChannels : maxPowerPerSubChannel);
00096         wns::Ratio maxSINR = maxTxPower/(interference * pathloss);
00097         apcResult.phyModePtr = phyModeMapper->getBestPhyMode(maxSINR);
00098 
00099         // we always try to use the minimal txPower for certain phymode to save power
00100         wns::Ratio minSINR = phyModeMapper->getMinSINRRatio(apcResult.phyModePtr);
00101         apcResult.txPower = wns::Power::from_mW(minSINR.get_factor() * pathloss.get_factor() * interference.get_mW() ) ;
00102         apcResult.sinr = minSINR;
00103         apcResult.estimatedCandI = wns::CandI(apcResult.txPower/pathloss,interference);
00104     }
00105     MESSAGE_SINGLE(NORMAL, logger,"doStartAPC("<<request.toString()<<"): "
00106                    <<"SINR="<<apcResult.sinr<<", PhyMode="<<*(apcResult.phyModePtr)<<", txPower="<<apcResult.txPower);
00107     return apcResult;
00108 }
00109 

Generated on Wed May 23 03:31:49 2012 for openWNS by  doxygen 1.5.5