dlsubframetimer.cc
上传用户:hzie11
上传日期:2013-10-07
资源大小:1487k
文件大小:3k
源码类别:

网络

开发平台:

C/C++

  1. /* This software was developed at the National Institute of Standards and
  2.  * Technology by employees of the Federal Government in the course of
  3.  * their official duties. Pursuant to title 17 Section 105 of the United
  4.  * States Code this software is not subject to copyright protection and
  5.  * is in the public domain.
  6.  * NIST assumes no responsibility whatsoever for its use by other parties,
  7.  * and makes no guarantees, expressed or implied, about its quality,
  8.  * reliability, or any other characteristic.
  9.  * <BR>
  10.  * We would appreciate acknowledgement if the software is used.
  11.  * <BR>
  12.  * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  13.  * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  14.  * FROM THE USE OF THIS SOFTWARE.
  15.  * </PRE></P>
  16.  * @author  rouil
  17.  */
  18. #include "dlsubframetimer.h"
  19. #include "framemap.h"
  20. #include "subframe.h"
  21. #include "wimaxscheduler.h"
  22. #include "contentionslot.h"
  23. /**
  24.  * Creates a timer to handle the subframe transmission
  25.  * @param subframe The DlSubframe
  26.  */
  27. DlSubFrameTimer::DlSubFrameTimer (DlSubFrame *subframe): burstIndex_(0), newburst_(true), mac_(0)
  28. {
  29.   assert (subframe);
  30.   subframe_ = subframe;
  31. }
  32. /**
  33.  * Reset the timer
  34.  */
  35. void DlSubFrameTimer::reset ()
  36. {
  37.   burstIndex_ = 0;
  38.   newburst_ = true;
  39.   if (status()==TIMER_PENDING)
  40.     cancel();
  41. }
  42. /**
  43.  * When it expires, the timer will handle the next packet to send
  44.  * @param e not used
  45.  */
  46. void DlSubFrameTimer::expire( Event* e )
  47. {
  48.   if (!mac_) {
  49.     mac_= subframe_->map_->getMac();
  50.   }
  51.   
  52.   //printf ("At %f in Mac %d DlsubFrameTimer expiresn", NOW, mac_->addr());
  53.   int iuc;
  54.   Burst *b = subframe_->getPdu()->getBurst(burstIndex_);
  55.   if (newburst_) {
  56.     //printf ("tburst=%x type=%dn", b,b->getIUC());
  57.     if (b->getIUC()==DIUC_END_OF_MAP) {
  58.       //printf ("tend of subframen");
  59.       burstIndex_=0;//reset for next frame
  60.       if (mac_->getScheduler()->getNodeType()==STA_MN) {
  61. mac_->getPhy()->setMode (OFDM_SEND);
  62.       } else {
  63. mac_->getPhy()->setMode (OFDM_RECV);
  64.       }
  65.       return; //end of subframe
  66.     }
  67.     //change modulation
  68.     iuc = b->getIUC();
  69.     Ofdm_mod_rate rate = subframe_->getProfile (iuc)->getEncoding();
  70.     mac_->getPhy()->setModulation (rate);
  71.   }
  72.   //check if packet to send
  73.   Packet *p = b->dequeue();
  74.   if (p) {
  75.     newburst_ = false;
  76.     double txtime = HDR_CMN(p)->txtime();
  77.     //schedule for next packet
  78.     mac_->transmit (p);
  79.     //printf ("tNext packet at %f(in %f)n", NOW+txtime, txtime);
  80.     if (b->getQueueLength()!=0) {
  81.       resched (txtime); //wait transmition time 
  82.       return;
  83.     }
  84.   }
  85.   
  86.   //no packet to send...schedule for next phypdu
  87.   newburst_= true;
  88.   burstIndex_++;
  89.   double stime=0.0;
  90.   assert (b->next_entry());
  91.   
  92.   stime = subframe_->map_->getStarttime();
  93.   stime += b->next_entry()->getStarttime()*mac_->getPhy()->getSymbolTime();
  94.   //printf ("tNext burst at %fn", stime);
  95.   resched (stime-NOW);
  96.   
  97. }